-1

尝试获取 SQL LEFT JOIN 以在另一个表中没有相应行的情况下返回 NULL。

表 1 - T1

id  n
1   aaa       
2   bbb       
3   ccc       

表 2 - T2

t1_id   t3_id
1   1
2   1
3   1
1   2
3   2
2   3
3   3

在 T2 中,请注意没有 2 - 2 或 1 - 3 的组合。

select * 
from t1
left join t2
on t1.id = t2.t1_id
order by t2.t3_id, t1_id

输出:

id  n   t1_id   t3_id
1   aaa         1   1
2   bbb         2   1
3   ccc         3   1
1   aaa         1   2
3   ccc         3   2
2   bbb         2   3
3   ccc         3   3

我期待会有另外两行

1   aaa         null    null
2   bbb         null    null

...对应于前面提到的 T2 中缺失的组合。

请注意 ORDER BY 只是为了方便起见 - 它对返回的行没有影响。

请帮助我理解为什么会发生这种情况,以及如何解决它。

4

3 回答 3

2

如果您想要结果集中的所有行t2,则它应该是以下引用的第一个表left join

select * 
from t2 left join
     t1
     on t1.id = t2.t1_id
order by t2.t3_id, t2.t1_id;

编辑:

您似乎想要生成不在原始数据中的新行。用于cross join生成行,然后left join将它们引入:

select t3.t3_id, t1.id, t1.n
from (select distinct t2.t3_id from t2) as t3 cross join
     t1 left join
     t2
     on t3.t3_id = t2.t3_id and t2.t1_id
于 2020-01-22T12:04:51.193 回答
0

或者,如果您确实想在 中t1首先引用,则FROM可以使用 aRIGHT JOIN代替(我个人觉得这些不太直观,但有些人确实更喜欢它们,并且当涉及更多表时它们确实有其用途):

SELECT * 
FROM t1
     RIGHT JOIN t2 ON t1.id = t2.t1_id
ORDER BY t2.t3_id,
         t1_id;
于 2020-01-22T12:28:07.837 回答
0
table1:
-------------
| id | name |
-------------
|  1 | john |
-------------
|  2 | mark |
-------------
|  3 | will |
-------------

table2:
-----------------
| t1_id | t3_id |
-----------------
|   1   |   3   |
-----------------
|   1   |   2   |
-----------------
|   3   |   1   |
-----------------

如果我想通过table2获取table1:

SELECT t1.* 
FROM table2 as t2 
LEFT JOIN table1 as t1
ON t1.id = t2.t1_id
WHERE 1
ORDER BY t1.id ASC;

你会得到:

-------------
| id | name |
-------------
|  1 | john |
-------------
|  1 | john |
-------------
|  3 | will |
-------------

编辑:

所以查询会得到table2中的所有内容,所以(t1_id: 1, t3_id: 3), (t1_id: 1, t3_id: 2), (t1_id: 3, t3_id: 1),那么左连接会比较的id t1 与 t2 中的 t1_id 并返回 t1 中的所有列,因为我写 *.

于 2020-01-22T12:28:39.190 回答