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
我有三个表:
字段:
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