2017-02-28 58 views
0

我在查詢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語句來做到這一點,但這也不起作用。任何幫助表示讚賞。

回答

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' 
       ) ; 
+1

我相信那些別名五世的應該是我的。 – KindaTechy

+0

謝謝,那正是我需要的。我很感激幫助。 –