Oracle SQL - 查找table1中不存在table2条件的记录

时间:2016-05-11 20:35:36

标签: sql oracle

我有2张桌子。 Table1将是主表。 表2包含与table1相关的数据。

表1:

WONUM
123
124
125

表2:

wonum    task     holdstatus
123        1        APPR
123        2        APPR
123        3        APPR

124        1        COMP
124        2        APPR

125        1        COMP
125        2        COMP

我想从table1中选择所有的winum,其中table1.wonum = table2.wonum,并且没有table2.HOLDSTATUS ='COMP'的记录

任何帮助都会很棒。

我得到的壁橱是:

select * from table1 where
exists (select 1 from table2 where table1.wonum=table2.wonum and holdstatus != 'COMP');

5 个答案:

答案 0 :(得分:2)

你几乎得到了正确的答案。 试试这个问题:

SELECT t1.wonum
FROM table1 t1
WHERE t1.wonum NOT IN (
  SELECT t2.wonum
  FROM table2 t2
  WHERE t2.wonum = t1.wonum
  AND t2.holdstatus = 'COMP'
);

这应该会为您提供所需的所有记录。在这种情况下,只记录123。

您也可以使用NOT EXISTS查询来执行此操作。一般来说,它们表现更好,但是如果你有一张小桌子,那么它就不会产生那么大的差别。

SELECT t1.wonum
FROM table1 t1
WHERE NOT EXISTS (
  SELECT t2.wonum
  FROM table2 t2
  WHERE t2.wonum = t1.wonum
  AND t2.holdstatus = 'COMP'
);

答案 1 :(得分:1)

即将结束,您只需使用NOT EXISTS并撤销holdstatus条件:

Select  *
From    table1  t1
Where Not Exists
(
    Select  *
    From    table2  t2
    Where   t1.wonum = t2.wonum
    And     t2.holdstatus = 'COMP'
);

答案 2 :(得分:0)

你可能需要

中的位置
select * from table1 
where wonum in (select distinct wonum  from table2  holdstatus != 'COMP');

答案 3 :(得分:0)

外部联接的解决方案略有不同:

select t1.wonum
from table1  t1
     left outer join table2 t2
     on t1.wonum = t2.wonum
        and t2.holdstatus = 'COMP'
where t2.wonum is null

答案 4 :(得分:0)

等同于其他示例但不使用“不存在”

SELECT *
FROM   table1 t1
WHERE  'COMP' <> ALL (SELECT t2.holdstatus
                     FROM   tables t2
                     WHERE  t2.wonum = t1.wonum);