Sql server 无法从多个表中获取结果
我有这个模式。我只对ItemNumber和ExternalInvoiceNUmber感兴趣。使用下面的代码Sql server 无法从多个表中获取结果,sql-server,Sql Server,我有这个模式。我只对ItemNumber和ExternalInvoiceNUmber感兴趣。使用下面的代码 Select StockItem.ItemNumber, PurchaseItem.Quantity, Purchase.ExternalInvoiceNumber, PurchaseItem.Delivered From StockItem Left Join PurchaseItem On PurchaseIt
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不显示任何已交付的记录。但是,如果已经传递了PO,那么它应该显示具有空白数量和空白外部发票号码的项目。这件事我绞尽脑汁已经一个星期了。您能帮助我吗?您需要在加入条件中进行筛选 在WHERE中,它成为一个内部连接
...
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
...
你能展示一下你想要的结果在测试数据上的样子吗?
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)