sql查找子查询中不存在的数据

时间:2013-09-19 15:55:46

标签: sql sql-server subquery

我正在尝试查找符合我的条件的所有记录。

我有一个一对多的表,对于每个键组合(wbs1,wbs2,wbs3),可能有很多记录。我正在尝试为每个组合查询此表,并仅在表没有符合我的“in”条件的记录时返回组合(wbs1,wbs2,wbs3)。

但此刻,我的查询似乎全部或全部都没有。

select distinct wbs1, wbs2, wbs3
     from dbo.Registry
     where not exists ( select wbs1, wbs2, wbs3, InspType
                        from Registry
                        where ISNULL(InspType,'') IN ('Test 1','Test 2')
                       )

我在返回时想要的是wbs1,wbs2,wbs3的列表,其中表“Registry”中没有与Test(InspType)标准匹配的条目。

谢谢!

2 个答案:

答案 0 :(得分:0)

这听起来像是一个“set-within-sets”子查询,我喜欢用having子句中的聚合和逻辑来解决它。以下将返回缺少一个或两个测试的所有组合:

select wbs1, wbs2, wbs3
from dbo.Registry r
group by wbs1, wbs2, wbs3
having sum(case when InspType = 'Test 1' then 1 else 0 end) = 0 or
       sum(case when InspType = 'Test 2' then 1 else 0 end) = 0;

答案 1 :(得分:0)

看起来你非常接近,子查询可能甚至没有必要,但是这个修改应该能得到正确的结果。但是按照书面形式,您需要一种方法来引用外部查询,因此需要dbo.Registry r别名。

select distinct wbs1, wbs2, wbs3
     from dbo.Registry r
     where not exists ( select 1
                        from Registry
                        where ISNULL(InspType,'') IN ('Test 1','Test 2')
                        and (wbs1 = r.wbs1 or wbs2 = r.wbs2 or wbs3 = r.wbs3)
                       )

这假设Microsoft Sql Server有一些风格,所以我不知道它是否可以在MySql或Oracle中运行等等。

但你也不能这样做

select distinct wbs1, wbs2, wbs3
from dbo.Registry
where ISNULL(InspType, '') != 'Test 1'
and ISNULL(InspType, '') != 'Test 2'

并完全避免子查询?