SQL 获取不在 JOIN 中的行

SQL get rows being not in JOIN

我有三个表:

字段:

f_id f_start f_end
1 10 20
2 15 25
3 5 10

人:

p_id p_name
1 Roger
2 John
3 Alicia
4 Patrick
5 Bob
6 Carlos
7 Mandy

影响:

id fk_field fk_person
1 2 1
2 1 2
3 3 3

使用此查询:

SELECT p.p_name, f.f_start, f.f_end
FROM person p
INNER JOIN affect a ON a.fk_person = p.p_id
INNER JOIN field f ON f.f_id = a.fk_field
WHERE f.f_end < 21 AND f.f_start > 7;

我得到了这个结果:

p_name f_start f_end
John 10 20

但我希望也有不受影响的人,这意味着他们有空。它包括将有像这样的空值:

p_name f_start f_end
John 10 20
Patrick
Bob
Carlos
Mandy

这可能吗?谢谢

使用左连接:

    FROM person p
    LEFT JOIN affect a ON a.fk_person = p.p_id
    INNER JOIN field f ON f.f_id = a.fk_field
    WHERE f.f_end < 21 AND f.f_start > 7; ```



您需要使用 LEFT JOIN 而不是 INNER JOIN 并且还需要在 LEFT JOIN 本身中指定条件。 WHERE 子句中的条件是为了获得您预期的结果。 IE。包括与 字段 table 匹配或在 affect table 中不可用的人:

SELECT p.p_name, f.f_start, f.f_end
FROM person p
LEFT JOIN affect a ON a.fk_person = p.p_id
LEFT JOIN field f ON f.f_id = a.fk_field AND f.f_end < 21 AND f.f_start > 7
WHERE f.f_id IS NOT NULL
 OR a.id IS NULL

输出:

p_name f_start f_end
John 10 20
Patrick
Bob
Carlos
Mandy

看到这个fiddle