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)