【发布时间】:2021-09-18 11:03:53
【问题描述】:
如何在不使用子查询的情况下找到过去 6 个月内未购买任何图书的客户。
SELECT first_name, last_name, email
FROM customers
WHERE id NOT IN (
SELECT customers.id
FROM customers
LEFT JOIN orders ON orders.customer_id = customers.id
WHERE DATEDIFF(MONTH, orders.purchased_date, GETDATE()) < 6
GROUP BY customers.id
);
【问题讨论】:
-
所以我只是使用估计的执行计划对我拥有
499,290客户端和“1,333,326”订单的真实表粗略地检查了它的性能。你的查询占了 43%,Johns 查询占了 39%(一个微小的改进),我的查询占了 9%(一个巨大的改进),SMors 查询占了 9%(又是一个巨大的改进)。很明显,性能不是您的标准,这就是为什么知道您为什么要排除子查询选项真的很有趣? -
哇,我没想到。当我学习 sql 时,讲师说子查询需要很长时间。以我的例子为例,当查询执行时,它会在客户表中执行两次,一次用于查找过去六个月内购买过 int 的所有客户,然后查找所有客户并检查客户 ID 是否不存在
-
这是学习 SQL Server 的一课...性能并不总是容易预测...只能通过测量来确定性能。特别是如果您对性能感兴趣,您应该要求一个高性能的查询,而不是假设应用可能会或可能不会产生任何影响的限制。
标签: sql sql-server database tsql filtering