访问2007 SQL合并表而不创建重复项

时间:2012-08-02 20:58:37

标签: sql ms-access-2007

我想在不创建基于多个字段的重复值的情况下将tblA的唯一值添加到tblB。在以下示例中,FirstName和LastName确定重复,Foo和Source无关。

TBLA:

FirstName  LastName  Foo  Source
John       Doe       1    A
Jane       Doe       2    A
Steve      Smith     3    A
Bill       Johnson   2    A 

tblB:

FirstName  LastName  Foo  Source
John       Doe       1    B
Bob        Smith     5    B
Steve      Smith     4    B 

这是我想要的结果:

tblA:

FirstName  LastName  Foo  Source
John       Doe       1    A
Jane       Doe       2    A
Steve      Smith     3    A
Bill       Johnson   2    A
Bob        Smith     5    B  

这是我尝试的代码的等价物:

INSERT INTO tblA
SELECT B.* FROM tblB AS B
LEFT JOIN tblA AS A ON A.FirstName = B.FirstName AND A.LastName = B.LastName
WHERE A.FirstName IS NULL

这是我得到的结果:

TBLA:

FirstName  LastName  Foo  Source
John       Doe       1    A
Jane       Doe       2    A
Steve      Smith     3    A
Bill       Johnson   2    A
John       Doe       1    B
Bob        Smith     5    B 

来自tblB的Steve Smith被忽略了,这很好。添加来自tblB的John Doe,这很糟糕。我花了太多时间在这上面,我已经按照我能想到的每一种方式检查数据,以确保tblA和tblB中的John Doe是相同的名字和姓氏。关于什么可能出错的任何想法?

更新:仅供参考,在我的实际tblB上,大约10,000个30,000应该转移到tblA。这实际上超过21,000。问题是这是一个共同过程的一步。

3 个答案:

答案 0 :(得分:1)

当我尝试:

SELECT tbb.*
FROM tbb 
LEFT JOIN tba 
ON (tbb.FirstName = tba.FirstName) 
   AND (tbb.LastName = tba.LastName)
WHERE (((tba.LastName) Is Null));

返回的唯一一行是:

Bob        Smith     5    B

John Doe有可能隐藏角色吗?

答案 1 :(得分:0)

编辑:抱歉,它无法在Access2007上运行

你有很多方法可以做到这一点:

INSERT INTO tblA 
SELECT B.* FROM tblB AS B 
WHERE B.firstname, B.lastname NOT IN (select firstname, lastname from tblA)

或者

INSERT INTO tblA 
SELECT * FROM tblB
MINUS
SELECT * FROM tblA

答案 2 :(得分:0)

这个适用于Access。

您可以将其运行到无穷大 - 它不会添加超出需要的行数:

INSERT INTO tblA
SELECT B.*
FROM tblB AS B
WHERE (((B.FirstName) Not In (select firstname from tblA))
AND ((B.LastName) Not In (select firstname from tblA)))