在两个表中提取不同的记录

时间:2012-09-25 08:52:49

标签: sql oracle set-operations

我有两张桌子 - table1table2。 两个表都有相同的列。

我想提取记录差异 - 意味着提取table1中的记录不在table2中,并在table2中提取记录而不是table1

如何在Oracle Sys中使用SQL来实现这一目标?

6 个答案:

答案 0 :(得分:3)

要获得一个结果集中两个表格的所有差异,您可以使用

select columnlist
from tableA
minus
select columnlist
from tableB
union all
select columnlist
from tableB
minus
select columnlist
from tableA

答案 1 :(得分:0)

  

MINUS获取一个SELECT语句的结果集,然后删除   那些也由第二个SELECT语句返回的行。

此查询将返回table1中的所有行,但不会返回table2中的所有行:

SELECT * FROM table1
MINUS
SELECT * FROM table2;

答案 2 :(得分:0)

select * from table1 where pk_col not in(select pk_col from table2)

select * from table2 where pk_col not in(select pk_col from table1)

答案 3 :(得分:0)

select t1.column1,t1.column2 from table1 t1 except select t2.column1,t2.column2 from table 2 t2 UNION all select t2.column1,t2.column2 from table 2 t2 except select t1.column1,t1.column2 from table1 t1

答案 4 :(得分:0)

select t1.Id,t1.name,t2.Id,t2.name from table1 t1 ,table2 t2 where t1.Id and t1.Name not in(select * from  table2) and t2.Id,t2.name not in (select * from table 2)

答案 5 :(得分:0)

RomanKonz的解决方案,附加信息表中实际包含行(我通常使用WITH来简化实际的UNION ALL / MINUS部分):

with 
  v_a as (
    select *
    from tableA), 
  v_b as (
    select *
    from tableB)
select * from 
(
 (select 'A only' src, v.* from v_a v
  minus 
  select 'A only' src, v.* from v_b v
 ) 
 union all
 (select 'B only' src, v.* from v_b v
  minus
  select 'B only' src, v.* from v_b v
 )
) order by primarykeycolumn, src