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

sql查找子查询中不存在的数据,sql,sql-server,subquery,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, InspT

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

我有一个一对多表,其中每个键组合(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”中没有与测试(InspType)标准匹配的条目

谢谢

这听起来像是“集合中的集合”子查询,我喜欢在
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;

看起来您已经非常接近了,而且子查询可能甚至没有必要,但是这次修改应该会得到正确的结果。但是,正如所写的,您需要一种引用外部查询的方法,即
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'

完全避免子查询?

我实际上是在注册表中没有匹配项的情况下查找wbs1、wbs2、wbs3组合。注册表中有许多InspType!=测试1或测试2。事实上,我不想让他们得到回报。我只想知道当测试1和测试2不存在时,这个组合的情况。哦,这有点难看,但也许这会在你的情况下起作用。这很有效!谢谢别名/引用正是我所缺少的。我不记得如何连接子查询。我尝试了这个,但仍然得到InspType为test1和test2的记录。“having”语句似乎没有排除这些记录?将“or”改为“AND”或将两者合并为一个单独的大小写:having sum(当InspType in('Test 1','Test 2')时为CASE,然后为1,否则为0结束)@GabeN。查询可能返回的记录包含其中一个值,但不能同时包含两个值。