2016-09-21 152 views
2

我有2個表,我必須比較才知道數據是否在。我試圖找到查詢,但還找不到。比較數據存儲在detail1和detail2,這樣定義:比較兩個表來檢查差異

detail1 
D1_ID (integer) 
D1_MASTERID (integer) 

與數據

| D1_MASTERID | D1_ID | 
|  1  | 1 | 
|  1  | 3 | 



detail2 
D2_ID (integer) 
D2_MASTERID (integer) 

與數據

| D2_MASTERID | D2_ID | 
|  1  | 1 | 
|  1  | 2 | 
|  1  | 4 | 

master 
MASTER_ID (integer) 

與數據

| MASTERID | 
|  1 | 

我試過很多方法,這是最後一次嘗試仍然doesnn't工作:

select MASTER_ID, D1_ID, D2_ID 
FROM master 
LEFT JOIN detail1 ON MASTERID=D1_MASTERID 
LEFT JOIN detail2 ON MASTERID=D2_MASTERID 

結果我得到的是一樣的東西

| MASTERID | D1_ID | D2_ID | 
| 1  | 1 | 1 | 
| 1  | 1 | 2 | 
| 1  | 1 | 4 | 
| 1  | 3 | 1 | 
| 1  | 3 | 2 | 
| 1  | 3 | 4 | 

我想什麼得到的是:

| MASTERID | D1_ID | D2_ID | 
| 1  | 1 | 1 | 
| 1  |  | 2 | 
| 1  | 3 |  | 
| 1  |  | 4 | 

我在想一個左連接可以這樣做......但它不工作。 或子查詢?我真的不知道

我檢查了該網頁http://sql.sh/cours/jointures但它並沒有幫助也...

THX

+2

它是mysql還是oracle?另外,請發佈您的預期結果的起始數據 – Aleksej

+0

其實它是在oracle(但它可以在以後的mysql)... – ffert2907

回答

2

,你可以先查詢detail1和detail2匹配的行。然後添加在detail1不匹配detail2行列表:

select master_id, d1_id, d2_id 
from master 
left join 
     detail1 
on  master_id = d1_master_id 
left join 
     detail2 
on  master_id = d2_master_id 
     and d1_id = d2_id 
union all 
select master_id, d1_id, d2_id 
from master 
left join 
     detail2 
on  master_id = d2_master_id 
left join 
     detail1 
on  master_id = d1_master_id 
     and d1_id = d2_id 
where d1_id is null -- Row not found in d1 

Example at SQL Fiddle.

+0

這工作正常。並與所有類型的數據庫兼容。 thx – ffert2907

4

在Oracle中,你可以使用FULL OUTER JOIN

select NVL(d1_masterid, d2_masterid) as masterid, d1_id, d2_id 
from 
     detail1 
FULL OUTER JOIN 
     detail2 
on  d1_masterid = d2_masterid 
and  d2_id = d1_id 
; 

,或者如果主可能包含的ID,這是不存在的在這兩個詳細表中:

with det as 
(
select NVL(d1_masterid, d2_masterid) as masterid, d1_id, d2_id 
from 
     detail1 
FULL OUTER JOIN 
     detail2 
on  d1_masterid = d2_masterid 
and  d2_id = d1_id 
) 
select distinct m.masterid, d1_id, d2_id 
from 
    master m 
LEFT OUTER JOIN 
det 
on m.masterid = det.masterid 
+0

很好的解決方案(問題被標記爲MySQL,但Oracle確實支持完全連接) – Andomar

+0

@Andomar:謝謝我編輯了我的答案 – schurik

+0

第一個解決方案沒有給出正確的結果。它只返回detail2中與「細節1」不匹配的那個 – ffert2907