2016-07-06 2 views
1

안녕하세요. 구매 주문을위한 스키마를 만들고 있습니다. 이러한 주문은 특정 사용자가 주문한 다음 다른 사용자가받을 수 있습니다.쿼리는 레코드를 반환하지 않습니다.

그래서 아래 스키마를 만들었습니다.

스키마

Schema

PurchaseOrdersDeliveries 테이블 UserID 열은 쿼리가 레코드를 반환하지 않는 다른 값을 가질 때 문제입니다.

쿼리

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

내부 조인을 사용할 때 데이터가 일치하지 않으면 레코드를 얻지 못합니다. LEFT JOIN을 사용해야하고 두 번째 조인은 사용자 ID가있는 조건이 필요 없습니다. 아래 쿼리를 사용해보십시오.

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 
관련 문제