Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 比较两个表以检查差异_Sql_Database_Oracle_Oracle11g - Fatal编程技术网

Sql 比较两个表以检查差异

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和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   | 
| 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