在子查询或连接语句中进行故障筛选

时间:2017-02-28 19:42:46

标签: sql sql-server

我正在查询SQL Server 2012中的库存数据库,以尝试获取已完成商品的商品列表。每个项目在“项目”表中都有一条记录。一些物品已被分组到托盘中。同一托盘中的所有物品都有一个共同的“托盘编号”。托盘出厂时,它们会标记托盘中的其中一个物品。其他人没有改变。我需要做的是创建一个正确查找未发送的项目的查询。此查询应查找属于同一托盘的项目。如果托盘中的一个物品已装运,则该托盘中的所有物品不应包含在退回的清单中。

查找作为已装运托盘一部分的所有物品的查询是:

select p.* from Items i
inner join Items p on i.PalletNum = p.PalletNum
where i.Status = 'SHIPPED'

搜索当前广告资源的主要查询是:

select * from Items
where i.Status = 'FINISHED GOODS'

如果我运行此查询,它将找到装运托盘的一部分的所有物品。我想要做的是从第二个查询中删除第一个查询返回的所有项目。我试过用子查询做这个但是它没有正常工作。这是我尝试使用子查询:

select inv.* from Items inv
where inv.Status = 'FINISHED GOODS' and not exists (
  select p.* from Items i
  inner join Items p on i.PalletNum = p.PalletNum
  where i.Status = 'SHIPPED') 

此查询不返回任何内容。我也试过通过对子查询使用Join语句来做到这一点,但这也没有用。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

一种方法是相关子查询

select i.*
from Items i
where v.Status = 'FINISHED GOODS' and
      not exists (select 1
                  from Items p 
                       where i.PalletNum = p.PalletNum and
                             p.Status = 'SHIPPED'
                 ) ;