2011-07-12 33 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)