Sql server 除了运算符T-SQL
任务:为任何两个月内至少有一次购买但并非全部三个月内都有一次购买的客户显示c_id和c_名称Sql server 除了运算符T-SQL,sql-server,tsql,Sql Server,Tsql,任务:为任何两个月内至少有一次购买但并非全部三个月内都有一次购买的客户显示c_id和c_名称 First Month = November Second Month = December Third Month = January SELECT c_id, c_name FROM books WHERE MONTH(order_date) = 11 INTERSECT SELECT c_id, c_name FROM books WHERE MONTH(order_date) = 12
First Month = November
Second Month = December
Third Month = January
SELECT c_id, c_name
FROM books
WHERE MONTH(order_date) = 11
INTERSECT
SELECT c_id, c_name
FROM books
WHERE MONTH(order_date) = 12
EXCEPT
SELECT c_id, c_name
FROM books
WHERE MONTH(order_date) = 1
我现在的代码否定了第三个月,但它没有完成任务要求的任务,即交替选择任何2个月
规则是:不计数、不子查询、不联接。我设法想出了这个办法
select c_id,c_name from books where month(order_date) = 1
intersect
select c_id,c_name from books where month(order_date) = 11
union
select c_id,c_name from books where month(order_date) = 1
intersect
select c_id,c_name from books where month(order_date) = 12
union
select c_id,c_name from books where month(order_date) = 12
intersect
select c_id,c_name from books where month(order_date) = 11
except
select c_id,c_name from books where month(order_date) = 1
intersect
select c_id,c_name from books where month(order_date) = 11
intersect
select c_id,c_name from books where month(order_date) = 12
这相当于表达式:
(集A相交集B)并集(集A相交集C)并集(集C相交集B)减(集A相交集B相交集C)
或者如图所示,区域AB、AC和BC
这当然不优雅,但考虑到需求,暴力似乎是一种有效的方法。为什么不使用基于月份的分组方式,然后使用计数=2而不是3?对此表示抱歉。我忘了包括计数/子查询/连接的无用好奇心-这是一个人为的问题来教你的功能,还是你所面临的实际情况,在上述条件下?是的!她希望我们通过严格使用这些特性来理解T-SQL的不同特性。一定要让我知道我的答案是否有用,或者你是否在寻找更优雅的解决方案。这幅画太棒了!我并没有完全理解“除了”部分,但这幅画确实很中肯。非常感谢。