Sql server SQL Server 2008-仅查找非活动记录

Sql server SQL Server 2008-仅查找非活动记录,sql-server,sql-server-2008,Sql Server,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

我需要编写一个只显示非活动订单的查询。非活动订单定义为没有活动订单项目的订单

我有以下疑问:

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


谢谢

编写一个子查询,查找包含活动项的所有订单,然后使用该子查询标识不在该数据集中的所有订单

例如


编写一个子查询,查找包含活动项的所有订单,然后使用该子查询标识不在该数据集中的所有订单

例如


@Mike,这不是最有效的查询,但由于其中包含@CustomerID,所以不重要,假设一个客户没有数百万个订单,并且CustomerID列上有一个索引。@Mike,这不是最有效的查询,但由于它包含@CustomerID,所以不重要,假设单个客户没有数百万订单,并且CustomerID列上有一个索引。
SELECT * FROM Orders
WHERE Orders.OrderID NOT IN (SELECT <query finding all orders with active items>)
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
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)