2016-07-06 134 views
1

您好,我正在爲採購訂單制定這些訂單可以由某個用戶訂購,然後由另一個用戶接收。查詢不返回任何記錄

所以我創建了下面的模式。

模式

Schema

的問題是當PurchaseOrdersDeliveriesUserID列具有查詢返回任何記錄不同的值。

查詢

SELECT 
    dbo.Users.FirstName, 
    dbo.Users.LastName, 
    dbo.PurchaseOrders.PurchaseOrderDate, 
    dbo.Deliveries.ExpectedDeliveryDate, 
    dbo.Deliveries.ActualDeliveryDate 
FROM dbo.PurchaseOrders 
INNER JOIN dbo.Users 
    ON dbo.PurchaseOrders.UserID = dbo.Users.UserID 
INNER JOIN dbo.Deliveries 
    ON dbo.PurchaseOrders.PurchaseOrderID = dbo.Deliveries.PurchaseOrderID 
    AND dbo.Users.UserID = dbo.PurchaseOrders.UserID 
    AND dbo.Users.UserID = dbo.Deliveries.UserID 

回答

3

需要兩個不同的連接到Users。你還需要學會使用表別名:

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 p.UserID = pu.UserID JOIN 
    dbo.Users du 
    ON d.UserId = du.UserId; 

你的查詢沒有返回的,因爲這種情況記錄:

AND dbo.Users.UserID = dbo.PurchaseOrders.UserID 
    AND dbo.Users.UserID = dbo.Deliveries.UserID 

這顯然意味着,dbo.PurchaseOrders.UserID = dbo.Deliveries.UserID。所以,如果這不是真的,那麼沒有記錄符合條件。

1

當您使用Inner Join時,如果數據不匹配,您將不會得到任何記錄。您需要使用LEFT JOIN,並且第二次連接不需要使用用戶標識的條件。嘗試下面的查詢。

SELECT 
dbo.Users.FirstName, 
    dbo.Users.LastName, 
    dbo.PurchaseOrders.PurchaseOrderDate, 
    dbo.Deliveries.ExpectedDeliveryDate, 
    dbo.Deliveries.ActualDeliveryDate 
FROM dbo.PurchaseOrders 
INNER JOIN dbo.Users 
    ON dbo.PurchaseOrders.UserID = dbo.Users.UserID 
LEFT JOIN dbo.Deliveries 
    ON dbo.PurchaseOrders.PurchaseOrderID = dbo.Deliveries.PurchaseOrderID