减去Oracle

时间:2017-01-25 10:46:48

标签: sql oracle oracle11g

我有一个表格SVS_TEMP,其中包含所有客户

ACCTID              CUSTID        PATH                        CUSTNAME
9080001380318   20800415729 /web/intsoft/DATA_MIGRATION.tif MAHAO JOHANE
9080001805335   10800101164 /web/intsoft/DATA_MIGRATION.tif LINDIWE RAQECHE
9080001380318   10800292271 /web/intsoft/DATA_MIGRATION.tif Mandate
9080002496026   10800387685 /web/intsoft/DATA_MIGRATION.tif MOEKETSI D. NTOI
9080003455730   10800618738 /web/intsoft/DATA_MIGRATION.tif Mandate

此表中没有主键

现在另一个表是signotherinfo,数据为

SIGNID    ACCTID        
1093418 9080001380318
1089652 9080001380318
1089711 9080001380318
1089910 9080001380318
1127222 9080001380318
1108463 9080001380318

其中signid是主键

我想从SVS_TEMP获取所有不在signotherinfo中的记录

2 个答案:

答案 0 :(得分:2)

如果不了解您可能遇到的限制(您提到没有PK),我会说反加入是您最好的选择:

select *
from SVS_TEMP t
where not exists (
  select null
  from sigotherinfo o
  where t.acctid = o.acctid
)

反连接的主要优点,如半连接(exists),如果找到匹配,它就会停止查找"可以这么说。

答案 1 :(得分:1)

两个表的OUTER JOIN将按您的要求执行:

SELECT s.*
  FROM SVS_TEMP t
  LEFT OUTER JOIN SIGNOTHERINFO s
    ON s.ACCTID = t.ACCTID
  WHERE s.ACCTID IS NULL;

这就是"取SVS_TEMP中的所有行并将它们连接到SIGNOTHERINFO中与ACCTID字段匹配的行,即使SIGNOTHERINFO"中没有匹配的行,也保留SVS_TEMP中的所有行。然后WHERE子句表示"仅保留那些未找到SIGNOTHERINFO匹配数据的结果集行"。

祝你好运。