2011-07-12 35 views
0

我有這個模式。我只對ItemNumber和ExternalInvoiceNUmber感興趣。使用以下無法從多個表中獲得結果

Select 
    StockItem.ItemNumber, 
    PurchaseItem.Quantity, 
    Purchase.ExternalInvoiceNumber, 
    PurchaseItem.Delivered 
    From 
     StockItem Left Join 
     PurchaseItem On PurchaseItem.fkStockItemId = StockItem.pkStockItemID Left Join 
     Purchase On Purchase.pkPurchaseID = PurchaseItem.fkPurchasId 

結果的代碼是不正是我想要

  ItemNumber Quantity ExternalInvoiceNumber Delivered 
      item1  10   PO9993    10 
      item1  10   PO9994    0 
      item1  10   PO9995    0 

的問題是,我不希望包含該項目的記錄,已交付的任何結果。我試圖用代碼

  where  PurchaseItem.Delivered <> '0' 

但隨後它不會顯示其只有1個externaminvoicenumber和已交付的任何項目。基本上,我想要的是爲mssql不顯示已交付的任何記錄。但是,如果採購訂單已經交付,那麼它應該顯示具有空白量和空白外部開票號的項目。我一直在關注這個問題。你可以幫我嗎?

+1

能告訴你如何你想會是什麼樣的結果在exapmle數據? – SWeko

回答

1

您需要在JOIN條件下過濾。

在WHERE,它成爲一個INNER JOIN

... 
Left Join 
PurchaseItem On 
      PurchaseItem.fkStockItemId = StockItem.pkStockItemID 
      AND PurchaseItem.Delivered <> '0' 
Left Join 
... 

或者說,我喜歡的風格,以單獨的連接和過濾

... 
Left Join 
(SELECT * FROM PurchaseItem WHERE Delivered <> '0') PurchaseItem 
     On PurchaseItem.fkStockItemId = StockItem.pkStockItemID 
Left Join 
... 
0
WITH DeliveredInvoice AS 
    (SELECT StockItem.ItemNumber as item, 0 as quant, 
     0 as ein, 0 as del 
     FROM StockItem 
     JOIN PurchaseItem ON PurchaseItem.fkStockItemId = StockItem.pkStockItemId 
     JOIN Purchase ON Purchase.pkPurchaseId = PurchaseItem.fkPurchaseId 
     WHERE PurchaseItem.Quantity > 0 
     AND PurchaseItem.Quantity = PurchaseItem.Delivered), 
    UndeliveredInvoice AS 
    (SELECT StockItem.ItemNumber as item, PurchasedItem.Quantity as quant, Purchase.ExternalInvoiceNumber as ein, 
     PurchaseItem.Delivered as del 
     FROM StockItem 
      JOIN PurchaseItem ON PurchaseItem.fkStockItemId = StockItem.pkStockItemId 
      JOIN Purchase ON Purchase.pkPurchaseId = PurchaseItem.fkPurchaseId 
     WHERE PurchaseItem.Delivered = 0) 

SELECT item, quant, ein, del 
FROM UndeliveredInvoice 

UNION 

SELECT item, quant, ein, del 
FROM UndeliveredInvoice 
WHERE item NOT IN (select distinct item from UndeliveredInvoice)