2012-08-02 59 views
1

我想将tblA的唯一值添加到tblB,而不会创建基于多个字段的重复值。在以下示例中,FirstName和LastName确定重复项,Foo和Source不相关。访问2007年SQL合并表,而不会创建重复

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史蒂夫·史密斯被忽略,这是很好的。来自tblB的John Doe被添加,这是不好的。我在这方面花了太多时间,我已经仔细检查了数据,以确保tblA和tblB中的John Doe具有相同的名字和姓氏。有什么想法可能会出错?

更新:FYI,在我的真实tblB上,约10,000的30,000应该被移到tblA。实际上这是超过21,000。问题是这是一个普通过程的一个步骤。

+0

关于你最近的编辑,它仍然是有效的,以测试一种情况下按我的意见。如果它证明是隐藏的字符,则可以考虑各种其他方法,这取决于字符。例如,Excel有时会传递字符255,看起来像一个空格。 – Fionnuala 2012-08-02 21:59:47

回答

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 

有没有可能是李四有一个隐藏的性格吗?

+1

我确实也一样。我输入了您的表格我已经完成了SELECT和INSERT – 2012-08-02 21:33:06

+0

感谢您的快速响应。我试过寻找一个隐藏的角色,并没有找到一个。我有一个基于相同字段标识dupe的Excel宏,它将违规行标识为重复项(当然我导出到Excel后)。如果有人找到隐藏的角色,你会如何去寻找? – mjoshawa 2012-08-02 21:42:08

+0

您可以尝试检查字段长度'SELECT LastName,Len(LastName)FROM tblB',您也可以尝试清空字段并重新输入Doe以查看是否会产生相同的问题。如果清除问题,则需要编码以清除隐藏的字符。有时Excel和Access之间的数据传输不好。 – Fionnuala 2012-08-02 21:47:51

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 
+3

你确定两个访问2007兼容吗? – 2012-08-02 21:15:16

+0

谢谢你的回复。不幸的是,这些都不能与Access 2007兼容。同样不幸的是:我必须使用Access 2007 – mjoshawa 2012-08-02 21:47:19

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))) 
+0

嗨hansup \t 感谢您对文本的帮助,现在看起来好多了 – Stan 2013-04-05 18:41:25