0

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

我有一个一对多的表,其中每个键组合(wbs1、wbs2、wbs3)可能有很多记录。我正在尝试为每个组合查询此表,并且仅当表没有与我的“输入”条件匹配的记录时才返回组合(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 的列表,其中“注册表”表中没有符合测试(InspType)标准的条目。

谢谢!

4

2 回答 2

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;
于 2013-09-19T15:58:30.773 回答
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'

并完全避免子查询?

于 2013-09-19T16:08:04.373 回答