2012-08-02 57 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