sql查找子查询中不存在的数据
我正在尝试查找所有不符合我的条件的记录 我有一个一对多表,其中每个键组合(wbs1、wbs2、wbs3)可能有许多记录。我试图为每个组合查询该表,并且仅当该表没有与我的“in”条件匹配的记录时才返回组合(wbs1、wbs2、wbs3) 但目前,我的查询似乎返回了全部或全部不返回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
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。查询可能返回的记录包含其中一个值,但不能同时包含两个值。