Sql 比较两个表以检查差异
我有两个表,我必须比较,以了解哪些数据在或没有。我试图查找查询,但尚未找到。要比较的数据存储在detail1和detail2中,定义如下:Sql 比较两个表以检查差异,sql,database,oracle,oracle11g,Sql,Database,Oracle,Oracle11g,我有两个表,我必须比较,以了解哪些数据在或没有。我试图查找查询,但尚未找到。要比较的数据存储在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
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 |
| MASTERID |
| 1 |
有数据
| 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 |
| MASTERID |
| 1 |
及
有数据
| 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 |
| MASTERID |
| 1 |
我尝试了很多方法,但这是最后一次仍然无效的尝试:
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 |
我在想左撇子也可以这么做。。。但它不起作用。
还是子方程?我真的不确定
我查看了那个页面,但也没用
Thx您可以首先查询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
在Oracle中,您可以使用
完全外部联接
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
;
或者,如果master可以包含两个详细表中都不存在的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
是mysql还是oracle?另外,请为您的预期结果发布起始数据。因为它在oracle上(但以后可以在mysql中发布)…很好的解决方案(问题在之前标记为mysql,但oracle支持完全联接)第一个解决方案没有给出正确的结果。它只返回与细节1不匹配的细节2