Customers Holidays id | name customer_id | start | end ---+------ ------------+--------+------ 1 | Peter 1 | 5 | 10 2 | Simon 1 | 15 | 20 3 | Mary 2 | 5 | 20
什么是一个有效的SQL查询,它给了我所有客户在特定日期没有假期?例如日期= 12
这是否可以通过简单的SQL连接进行管理,还是需要使用子查询?
首先创建一个查找与您想要的相反的查询:在该特定日期有假期的客户:
SELECT DISTINCT name
FROM Customers
JOIN Holidays
ON id = customer_id
WHERE start <= 12 AND end >= 12
Run Code Online (Sandbox Code Playgroud)
结果:
Simon
Run Code Online (Sandbox Code Playgroud)
然后将此结果连接回customer表并选择连接失败的结果:
SELECT name
FROM Customers
LEFT JOIN (
SELECT DISTINCT id
FROM Customers
JOIN Holidays
ON id = customer_id
WHERE start <= 12 AND end >= 12
) AS T1
ON Customers.id = T1.id
WHERE T1.id IS NULL
Run Code Online (Sandbox Code Playgroud)
结果:
Peter
Mary
Run Code Online (Sandbox Code Playgroud)
请注意,JOIN不是此处的唯一选择.你也可以使用NOT EXISTS,NOT IN或EXCEPT.由于您没有指定哪个数据库,我选择了JOIN,因为它是一种可移植且有效的方法,可以在所有主要关系数据库中执行此操作.
我使用的测试数据(取自问题):
CREATE TABLE Holidays (customer_id INT NOT NULL, start INT NOT NULL, end INT NOT NULL);
INSERT INTO Holidays (customer_id, start, end) VALUES
(1, 5, 10),
(1, 15, 20),
(2, 5, 20);
CREATE TABLE Customers (id INT NOT NULL, name NVARCHAR(100) NOT NULL);
INSERT INTO Customers (id, name) VALUES
(1, 'Peter'),
(2, 'Simon'),
(3, 'Mary');
Run Code Online (Sandbox Code Playgroud)