sql查询明显连接

时间:2010-08-25 13:42:44

标签: sql ms-access

抱歉,我错过了,并且再次删除了之前的事故问题。

我有一种情况,我试图从表1中选择不同的新值并将它们存储在表2中。问题是表在列“name”上有重复但是它确实有一个键列“id” ,但不同的ID当然会映射到同一个名称。

我对查询的想法是

INSERT INTO TABLE2 
(NAME, UniqueID) 
  SELECT DISTINCT TABLE1.NAME, TABLE1.ID 
  FROM TABLE1 
  LEFT JOIN TABLE2 ON TABLE1.ID=TABLE2.UniqueID 
  WHERE TABLE2.NAME IS NULL 

需要帮助才能让查询返回我想要的结果,现在它仍然会在table2(名称列)中生成重复项,这是我不想要的。我希望它只附加新记录,即使我多次运行查询。例如,如果将两个新记录添加到table1中,但其中一个名称已经在表2中,那么查询只会向table2添加1个新记录

只是一个注释:我正在使用ms访问,因此它对单个查询具有严格的语法

修改

Folliwing输入我带来了这个查询

INSERT INTO TABLE2 
(NAME, UniqueID) 
  SELECT TABLE1.NAME, Min(TABLE1.ID) 
  FROM TABLE1 
  LEFT JOIN TABLE2 ON TABLE1.NAME=TABLE2.NAME 
  WHERE TABLE2.UniqueID IS NULL 
  Group By TABLE1.NAME;

但是这些实际上必须分成两个独立的wueries,在没有reserver错误标志的情况下运行,但现在我遇到了另外一个问题。当我运行两个单独的查询时,它第一次运行正常,但是当我运行它两次尝试测试以查看是否有任何新记录已添加到表1时,它会在表1中没有新记录时附加1条记录,因此它会附加一个空白的名称值和一个重复的唯一ID,并且每次运行它时都会不断地执行相同的过程。

2 个答案:

答案 0 :(得分:1)

INSERT INTO TABLE2 (UniqueID, NAME)  
SELECT min(t1.ID) as UniqueID, t1.NAME  
FROM TABLE1 t1 
LEFT JOIN TABLE2 t2 ON t1.ID=t2.UniqueID  
WHERE t2.NAME IS NULL  
group by t1.NAME  

答案 1 :(得分:1)

由于您同时提取了名称和ID,因此distinct关键字只会提取不同的组合。具有相同名称和不同ID的两个记录仍然有效。

如果两个名称具有不同的ID,您希望插入哪个?...

insert into table2 (Name, UniqueID)
select t1.Name, MIN(t1.ID)
from table1 t1
left join table2 t2 on t1.ID = t2.UniqueID
where t2.Name is null
group by t1.Name

在回复评论时,我意识到名称字段应该加入,以防止已经存在的欺骗。

insert into table2 (Name, UniqueID)
select t1.Name, MIN(t1.ID)
from table1 t1
left join table2 t2 on t1.Name = t2.Name
where t2.UniqueID is null
group by t1.Name