【发布时间】:2017-12-11 13:14:28
【问题描述】:
我有一张客户表
+--------+---------+ |身份证 |姓名 | +--------+---------+ | 1 |一个 | | 2 |乙 | | 3 | c | | 4 | d | | 5 | 3 | | 6 | f | | 7 |克 | +--------+---------+还有一张订单表
+-----+------+--------------+ |身份证 | C_Id |订购日期 | +-----+------+--------------+ | 1 | 1 | 2017-05-12 00:00:00.000 | | 2 | 2 | 2017-12-12 00:00:00.000 | | 3 | 3 | 2017-11-12 00:00:00.000 | | 4 | 4 | 2017-12-12 00:00:00.000 | | 5 | 1 | 2017-12-12 00:00:00.000 | | 6 | 2 | 2017-12-12 00:00:00.000 | | 7 | 3 | 2017-12-12 00:00:00.000 | | 8 | 4 | 2017-11-12 00:00:00.000 | | 9 | 2 | 2017-06-12 00:00:00.000 | | 10 | 3 | 2017-07-12 00:00:00.000 | +-----+------+--------------+我需要上个月没有购买的客户的结果。 那是来自客户 3 和 4 上个月(11 月)购买的订单表。结果不应包括客户 3 和 4,即使他们在前几个月购买过。
我有这个查询可以完美地返回结果。
SELECT C_ID , MONTH(OrderDate) from [Order]
WHERE MONTH(OrderDate) <> MONTH(GETDATE()) - 1
AND C_ID NOT IN (
SELECT C_ID FROM [Order]
WHERE MONTH(OrderDate) = MONTH(GETDATE()) - 1)
谁能帮我在不使用子查询的情况下编写这个查询
编辑: 为了更清楚起见,如果客户在 11 月有任何购买,我需要从结果中排除客户(获取当年的所有订单),我也需要此结果一年。
【问题讨论】:
-
为什么不想要子查询?是什么让您认为没有子查询的另一种解决方案会更快?
-
如果省略子查询会发生什么?看起来不应该包含
MONTH(OrderDate) == MONTH(GETDATE()) - 1的行。 -
@AhmadWabbi 我被要求编写不带子查询的查询。我需要学习其他可能的方法来获得预期的结果
-
@daniu 如果删除子查询意味着我将获得 11 月份尚未购买的客户,但结果中仍然获得客户 3 和 4,这不是我的预期结果。如果客户在 11 月购买,我需要将他们排除在结果之外。
标签: sql-server subquery query-optimization