2009-01-10 54 views

回答

1

你也可以使用一個左外連接(第一告訴你在哪裏在表中存在行,否B,第二反之亦然):

SELECT a.id FROM a LEFT JOIN b ON a.id = b.id WHERE b.id IS NULL 
SELECT b.id FROM b LEFT JOIN a ON b.id = a.id WHERE a.id IS NULL 
1
SELECT DISTINCT id FROM a WHERE NOT EXISTS (SELECT * FROM b WHERE a.id = b.id); 
SELECT DISTINCT id FROM b WHERE NOT EXISTS (SELECT * FROM a WHERE a.id = b.id); 
7

無論答案公佈到目前爲止(來自BrynJ和Vadim)做了非常徹底的工作。做徹底的工作也非常困難。兩個答案都假設知道每個表中存在哪些ID號就足夠了。但是,一般來說,表格有多個列。

讓我們把表A和B.

的一個重要問題是「兩代表具有相同的架構」?如果沒有,那麼一個問題是哪些列需要被添加到A,哪些列需要被添加到B以使他們的模式相同。這是一個元數據查詢,可以從系統目錄中得到答覆。添加到表中的列應插入哪些值是一個有趣的問題。

我們假設這些表實際上具有相同的模式,包括相同的主鍵和列之間相同的功能依賴關係。我們還假設有一個ID列(存儲唯一的整數),Name列(一個字符串)和一個DATE類型的RefDate列。

Table A         Table B 
ID Name   RefDate    ID Name   RefDate 
1 Frederick 2007-01-23    1 Josephine 2009-01-10 

現在,需要從每個表中插入,刪除,更新以使它們相同?

我認爲可以公平地說,如果不知道更多的上下文,就沒有單一的答案。這可能是弗雷德裏克自2007年以來經歷了性別改變手術,而B中的入門代表了她的新身份。或者它可能是一個錯誤;數據庫不應該同時存儲這些記錄。或者可能有另一個解決方案。

不幸的是,來自BrynJ和Vadim的詢問都表明A和B之間沒有區別,這對我來說是一個可疑的命題。

順便提一句,請注意,比較行可能有空位時的行比它們沒有時更復雜。例如,考慮比較名稱:

沒有空值:

(A.Name = B.Name) 

用null:

(A.Name = B.Name OR (A.Name IS NULL AND B.Name IS NULL)) 

一個理由迴避空值時,您可以。

相關問題