2011-06-24 71 views
1

我有3個表,'舊','新'和'結果'表(來自電話簿數據庫),它們具有相同的結構和幾乎相同的條目。MySQL選擇2個表之間的所有區別?

old: 
ID | name    | number | email | ... 
----+--------------------+--------+-------+----- 
1 | foo    | 123 | ... 
2 | bar    | 456 | 
3 | entrry with typo || 
4 | John Doe   | 123345 | 

new: 
ID | name    | number | email | ... 
----+--------------------+--------+-------+----- 
1 | foo    | 123 | ... 
2 | bar    | 456 | 
3 | entry without typo || 
4 | John Doe   | 12345 | 
5 | newly added entry | 09876 | 

從這個「新」的表,我想選擇是從「老」表中的不同都行,這樣的結果將是:

result: 
ID | name    | number | email | ... 
----+--------------------+--------+-------+----- 
3 | entry without typo || ... 
4 | John Doe   | 12345 | 
5 | newly added entry | 09876 | 

包括已更改數據的所有條目加上所有沒有出現在「舊」表中的條目...

不僅使它更復雜,這些表中大約有10列(包括ID,名稱,號碼,電子郵件和幾個標誌以及其他信息)。

是否有任何最高性能的解決方案這樣做,或者我將不得不比較每個列與新的查詢..?

+0

一個高質量的工作將需要你手工完成 - 'name'/etc不是一個可靠的方法來確定什麼是或不存在,或已經改變... –

回答

4

您必須對舊記錄進行正確性比較,但我認爲這是最直接的解決方案。

更新我有點困惑icluding已更改數據的所有條目加上沒有出現在「老」表......所有條目所以我加入了其中,並修改了加入條款

insert into result (id, name, number, email, ...) 
select new.id, new.name, new.number, new.email, ... 
from new 
LEFT JOIN old 
ON new.ID = old.id 
WHERE 
old.ID is null 
OR 
(new.name <> old.name 
    or 
    new.number <> old.number 
    or 
    new.email <> new.email 
    ...) 
+0

洙非常感謝,我仍然沒有與JOIN語法相處不足 - .- – flo

1
SELECT new.* 
FROM new 
JOIN old ON new.id = old.id 
WHERE (CONCAT(new.ID,new.name,new.number,etc...) <> CONCAT(old.ID,old.name,old.number,etc...)) 

這應該拉起新表中的任何記錄,其中至少有一個字段與舊錶中的等效記錄不同。

+0

我首先想到的是比較兩行的校驗和,但是我沒有找到用於做的函數,所以我認爲CONCAT()也適用。 – flo

0

假設ID必須爲了使比較合理的熱身賽:

select n.* 
from new n 
left join old o on o.id = n.id 
where o.id is null 
    or not (
    and o.name = n.name 
    and o.number = n.number 
    and o.email = n.email 
    and ...) 

注意,該解決方案處理這樣一些字段可以爲NULL的情況。如果使用(o.name <> n.name)而不是(o.name = n.name),則不會正確地將NULL視爲與非空值不同。