2016-07-06 18 views
1

Hallo, ich mache Schema für Kaufaufträge diese Aufträge können von bestimmten Benutzer bestellt werden und dann von einem anderen Benutzer erhalten.Abfrage gibt keine Datensätze zurück

Also habe ich das folgende Schema erstellt.

Schema

Schema

Das Problem ist, wenn UserID Spalte in PurchaseOrders und Deliveries Tabellen unterschiedliche Werte hat die Abfrage keine Datensätze zurückgibt.

Abfrage

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 

Antwort

3

Sie benötigen zwei Users unterschiedlichen verbindet. Sie müssen auch Tabelle Aliase verwenden lernen:

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; 

Ihre Anfrage ab, weil dieser Zustand keine Datensätze zurückgibt:

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

Das bedeutet natürlich, dass dbo.PurchaseOrders.UserID = dbo.Deliveries.UserID. Wenn dies nicht der Fall ist, stimmen keine Datensätze mit der Bedingung überein.

1

Wenn Sie Inner Join verwenden, erhalten Sie keine Datensätze, wenn die Daten nicht übereinstimmen. Sie müssen LEFT JOIN verwenden und auch der zweite Join benötigt keine Bedingung mit Benutzer-ID. Versuchen Sie die folgende Abfrage.

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 
Verwandte Themen