【问题标题】:SQL Server 2008 - Only find inactive recordsSQL Server 2008 - 仅查找非活动记录
【发布时间】:2011-02-23 05:16:21
【问题描述】:

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

我有以下疑问:

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?

谢谢!

【问题讨论】:

    标签: sql-server sql-server-2008


    【解决方案1】:
    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
    

    【讨论】:

    • @Mike,这不是最有效的查询,但由于其中包含@CustomerID,所以假设单个客户没有数百万个订单并且有一个索引CustomerID 列。
    【解决方案2】:

    编写一个子查询来查找所有具有活动商品的订单,然后使用它来识别不在该数据集中的所有订单。

    例如

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

    【讨论】:

      【解决方案3】:
      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)
      

      【讨论】:

        猜你喜欢
        • 2011-08-19
        • 2017-02-14
        • 2011-01-31
        • 2023-03-17
        • 1970-01-01
        • 2012-03-21
        • 2018-04-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多