我有三张桌子t1
,,,t2
。t3
每个表中的记录都可以链接到前一个。
CREATE TABLE t1 (
id INT NOT NULL PRIMARY KEY
);
CREATE TABLE t2 (
id INT NOT NULL PRIMARY KEY,
t1_id INT
);
CREATE TABLE t3 (
id INT NOT NULL PRIMARY KEY,
t2_id INT
);
INSERT INTO t1 (id) VALUES (1);
INSERT INTO t2 (id, t1_id) VALUES (1, 1);
INSERT INTO t2 (id, t1_id) VALUES (2, NULL);
INSERT INTO t3 (id, t2_id) VALUES (1, 1);
INSERT INTO t3 (id, t2_id) VALUES (2, 2);
INSERT INTO t3 (id, t2_id) VALUES (3, NULL);
我需要在两个条件下从所有三个表中提取记录
- 记录
t2
可能不存在 - 如果
t2
有记录,那么只有那些引用t1
那些。应该是这样的样本
t3.id | t2.id | t1.id |
---|---|---|
一 | 一 | 一 |
3 | 无效的 | 无效的 |
我试过这个查询
SELECT
*
FROM
t3
LEFT JOIN t2 ON (t3.t2_id = t2.id)
JOIN t1 ON (t2.t1_id = t1.id)
但只有一个条目
t3.id | t2.id | t1.id |
---|---|---|
一 | 一 | 一 |
这个查询解决了我的问题
SELECT
*
FROM
t3
LEFT JOIN t2 ON (t3.t2_id = t2.id)
LEFT JOIN t1 ON (t2.t1_id = t1.id)
WHERE
t2.id IS NULL OR
t2.t1_id IS NOT NULL
但我不明白 JOIN 如何与 LEFT JOIN 结合使用?记录有什么用?或者是记录不能join到NULL的问题,什么join到什么的顺序没有定义?
链接到DB Fiddle
LEFT JOIN
在 T3 和 resultINNER JOIN
以及 T2 和 T1之间执行与