SQL Server 2008 - только найти неактивные записи - PullRequest
1 голос
/ 22 февраля 2011

Мне нужно написать запрос, который показывает только неактивные заказы.Неактивный заказ определяется как заказ без активных элементов заказа.

У меня следующий запрос:

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 ]

3 голосов
/ 23 февраля 2011
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
2 голосов
/ 22 февраля 2011

Напишите подзапрос, который находит все заказы с активными элементами, а затем используйте его, чтобы идентифицировать все заказы, не входящие в этот набор данных.

Например,

SELECT * FROM Orders
WHERE Orders.OrderID NOT IN (SELECT <query finding all orders with active items>)
0 голосов
/ 23 февраля 2011
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...