如何进行删除值的连接?

Geo*_*lly 3 sql join

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连接进行管理,还是需要使用子查询?

Mar*_*ers 6

首先创建一个查找与您想要的相反的查询:在该特定日期有假期的客户:

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 INEXCEPT.由于您没有指定哪个数据库,我选择了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)