我正在尝试查找不符合我的条件的所有记录。
我有一个一对多的表,对于每个键组合(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)标准匹配的条目。
谢谢!
答案 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'
并完全避免子查询?