Sql 如何查找表中列中没有特定文本的所有项

Sql 如何查找表中列中没有特定文本的所有项,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我有一张桌子。。此表有项目编号、loc、bin编号列。每个项目编号在位置2应有4个bin。如何找到loc 2中没有这四个箱子的所有物品 我试过了 select item_no from iminvbin_sql where bin_no not in('910SHIP','910STAGE','910PROD','1') AND loc = 2 但那没用 itemno loc bin 0 2 1 0 2 910PROD 0 2 910

我有一张桌子。。此表有项目编号、loc、bin编号列。每个项目编号在位置2应有4个bin。如何找到loc 2中没有这四个箱子的所有物品

我试过了

select item_no from iminvbin_sql where bin_no not in('910SHIP','910STAGE','910PROD','1') AND loc = 2
但那没用

itemno loc  bin

0       2    1 
0       2    910PROD
0       2    910SHIP
0       2    910STAGE

我想这就是你想要的:

select item_no
from iminvbin_sql
where bin_no in ('910SHIP', '901STAGE', '910PROD', '1') and
      loc = 2
group by item_no
having count(distinct bin_no) <> 4;
这将检查所有四个值是否都在箱子中。如果要验证这四个值是否在存储箱中,而没有其他值在存储箱中,您也可以进行测试:

select item_no
from iminvbin_sql
where loc = 2
group by item_no
having count(distinct bin_no) <> 4 or
       count(distinct case when bin_no in ('910SHIP', '901STAGE', '910PROD', '1') then bin_no end) <> 4 or
       count(*) <> 4;
编辑:

针对Bohemian的评论,以下内容应包含所有未完全填充的项目:

select item_no
from iminvbin_sql
group by item_no
having count(distinct case when loc = 2 then bin_no end) <> 4 or
       count(distinct case when loc = 2 then bin_no in ('910SHIP', '901STAGE', '910PROD', '1') then bin_no end) <> 4 or
       sum(case when loc = 2 then 1 else 0 end) <> 4;
将group by与having子句一起使用,以确定是否所有箱子都不存在:

select item_no
from iminvbin_sql
group by item_no
having sum(case when loc = 2 and bin_no in ('910SHIP','901STAGE','910PROD','1') then 1 end) < 4

此查询的要点是,通过将条件移动到案例中,它将发现没有任何列出的BIN的项目,甚至没有loc=2数据的项目

起初也这么认为,但您的第一个查询不会返回没有列出任何bins@Bohemian . . . 这是一个很好的观点,在这种情况下很重要,因为我们的目标是找到坏的项目,而不是好的项目。没有这样的行似乎很糟糕。当我运行这些行时,它返回27000行。我检查了其中的10个,他们都有正确的垃圾箱起初这些都不起作用。。。但后来我注意到“901舞台”应该是910舞台。非常感谢。
select item_no
from iminvbin_sql
group by item_no
having sum(case when loc = 2 and bin_no in ('910SHIP','901STAGE','910PROD','1') then 1 end) < 4