2

我有一个名为 Orders 的表,其中包含以下字段:CustomerID、OrderDate

例如

1, 01/01/2011
2, 02/02/2011
1, 01/07/2012

我试图找出一种查询此表的方法,以了解客户是否在 2011 年订购并且在 2012 年没有订购任何东西并返回不同的客户 ID ...

4

2 回答 2

1

比较这两种方法来确定哪些 OrderDates 来自 2012 年:

  1. Year(OrderDate) = 2012
  2. OrderDate >= #2012-01-01# AND OrderDate < #2013-01-01#

第一种方法写起来很简单,也很容易理解。但是,它需要数据库引擎访问Orders表中的每一行并使用该Year()函数来查看该行是否符合您的标准。当表很大时,如果它包含许多 OrderDates 超出目标范围的行,这可能会花费很多时间。最重要的是,由于该功能强制数据库引擎检查每一行,您的查询不能利用索引来加速数据检索。

第二种方法虽然更冗长,但允许 db 引擎仅检查满足您的标准的那些行。使用上的索引OrderDate,它很容易比第一种方法快一个数量级。

如果您的桌子足够小和/或您不关心性能,那对您来说不是问题。但是,我仍然建议您尝试此版本...

SELECT DISTINCT o2011.CustomerID
FROM
    Orders AS o2011
    LEFT JOIN
    (
        SELECT DISTINCT CustomerID
        FROM Orders
        WHERE 
                OrderDate >= #2012-01-01#
            AND OrderDate < #2013-01-01#
    ) AS sub2012
    ON o2011.CustomerID = sub2012.CustomerID
WHERE
        o2011.OrderDate >= #2011-01-01#
    AND o2011.OrderDate < #2012-01-01#
    AND sub2012.CustomerID Is Null;
于 2012-12-02T17:44:45.030 回答
0

你可以试试这个:

 select distinct CustomerID
 from Orders
 where year(OrderDate) = 2011
 and CustomerID not in (
    select distinct CustomerID
    from Orders
    where year(OrderDate) = 2012
    ) 
于 2012-12-02T17:10:25.453 回答