2011-02-22 8 views
1

비활성 주문 만 표시하는 쿼리를 작성해야합니다. 비활성 주문은 활성 주문 품목이없는 주문으로 정의됩니다.SQL Server 2008 - 비활성 레코드 만 찾으십시오.

SELECT Orders.OrderID, Orders.OrderDate 
FROM Orders INNER JOIN 
     OrderItems ON Orders.OrderID = OrderItems.OrderID INNER JOIN 
     Products ON OrderItems.ProductID = Products.ProductID INNER JOIN 
     ProductSubCategories ON Products.ProductSubCategoryID = ProductSubCategories.ProductSubCategoryID INNER JOIN 
     ProductCategories ON ProductSubCategories.ProductCategoryID = ProductCategories.ProductCategoryID 
WHERE (Orders.CustomerID = @CustomerID) AND (OrderItems.OrderItemStatusID = 2) AND (ProductSubCategories.ProductCategoryID = 1) 
GROUP BY Orders.OrderID, Orders.OrderDate 

OrderItems.OrderItemStatusID = 2가 주문 항목이 비활성 의미 :

나는 다음과 같은 쿼리를 가지고있다. OrderItems.OrderItemStatusID = 1은 주문 항목이 활성 상태임을 나타냅니다.

문제는 쿼리에 모든 비활성 주문뿐만 아니라 비활성 및 활성 주문 항목이 모두 나열되어 있다는 것입니다.

예 :

주문 123에는 비활성 및 활성 주문 항목이 모두 있습니다. 조회 결과에는 나타나지 않아야하지만 조회 결과에는 나타나지 않아야합니다.

주문 234에는 모든 비활성 주문 항목이 있습니다. 그것은 올바르게 나타납니다.

주문 123을 어떻게 제외합니까?

감사합니다.

답변

3
SELECT Orders.OrderID, Orders.OrderDate 
FROM Orders INNER JOIN 
     OrderItems ON Orders.OrderID = OrderItems.OrderID INNER JOIN 
     Products ON OrderItems.ProductID = Products.ProductID INNER JOIN 
     ProductSubCategories ON Products.ProductSubCategoryID = ProductSubCategories.ProductSubCategoryID INNER JOIN 
     ProductCategories ON ProductSubCategories.ProductCategoryID = ProductCategories.ProductCategoryID 
WHERE (Orders.CustomerID = @CustomerID) AND (ProductSubCategories.ProductCategoryID = 1) 
GROUP BY Orders.OrderID, Orders.OrderDate 
HAVING MIN(OrderItems.OrderItemStatusID) = 2 
+0

빠르고 쉬운. 감사! – Mike

+0

@Mike, 이것은 가장 효율적인 쿼리는 아니지만 단일 고객이 수백만 주문을 가지고 있지 않고 CustomerID 열에 인덱스가 있다고 가정 할 때 @CustomerID가 있기 때문에 중요하지 않습니다. –

2

활성 항목이있는 모든 주문을 찾은 하위 쿼리를 작성한 다음 해당 항목을 사용하여 해당 데이터 집합에 포함되지 않은 모든 주문을 식별합니다.

예.

SELECT * FROM Orders 
WHERE Orders.OrderID NOT IN (SELECT <query finding all orders with active items>) 

0
SELECT Orders.OrderID, Orders.OrderDate 
FROM Orders 
WHERE Orders.OrderID NOT IN 
(select distinct o.OrderId 
from Orders o 
    left join OrderItems oi on o.OrderID = oi.OrderID 
where oi.OrderItemStatus != 2)