我有一个名为 Orders 的表,其中包含以下字段:CustomerID、OrderDate
例如
1, 01/01/2011
2, 02/02/2011
1, 01/07/2012
我试图找出一种查询此表的方法,以了解客户是否在 2011 年订购并且在 2012 年没有订购任何东西并返回不同的客户 ID ...
比较这两种方法来确定哪些 OrderDates 来自 2012 年:
Year(OrderDate) = 2012
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;
你可以试试这个:
select distinct CustomerID
from Orders
where year(OrderDate) = 2011
and CustomerID not in (
select distinct CustomerID
from Orders
where year(OrderDate) = 2012
)