2016-07-15 40 views
0

您好,我正在为采购订单制定这些订单可以由某个用户订购,然后由另一个用户接收。从多个表中检索记录问题

问题是当交货表中的用户ID值为空时查询返回没有记录。

UserID值为空,因为订单尚未交付。

查询

SELECT pu.FirstName as purchase_FirstName, pu.LastName as purchase_LastName, 
     du.FirstName as delivery_FirstName, du.LastName as delivery_LastName, 
     po.PurchaseOrderDate, 
     d.ExpectedDeliveryDate, d.ActualDeliveryDate 
FROM dbo.PurchaseOrders po JOIN 
    dbo.Deliveries d 
    ON po.PurchaseOrderID = d.PurchaseOrderID JOIN 
    dbo.Users pu 
    ON po.UserID = pu.UserID JOIN 
    dbo.Users du 
    ON d.UserId = du.UserId; 

模式

enter image description here

+0

所以把一个条件WHERE用户ID不是NULL。或者如果你想包含它们,你可以在userid为空的地方进行。如果您仍然需要记录,您还必须将您的联接更改为左联接。 – JonH

+0

'Deliveries'上的'left join'会诀窍吗? –

回答

3

最有可能你需要一个LEFT JOIN这里。一点点格式化使得这个LOT更容易阅读。您可以阅读本文以了解不同类型的连接。 http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

SELECT pu.FirstName as purchase_FirstName 
    , pu.LastName as purchase_LastName 
    , du.FirstName as delivery_FirstName 
    , du.LastName as delivery_LastName 
    , po.PurchaseOrderDate 
    , d.ExpectedDeliveryDate 
    , d.ActualDeliveryDate 
FROM dbo.PurchaseOrders po 
JOIN dbo.Users pu ON po.UserID = pu.UserID 
left JOIN dbo.Deliveries d ON po.PurchaseOrderID = d.PurchaseOrderID 
left JOIN dbo.Users du ON d.UserId = du.UserId;