2016-09-21 104 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