加入两个表......没有加入
Join two tables... without JOIN
我有两个 tables T1 和 T2,都有一个字段 (id)。
T1.id has values:
1
2
4
T2.id has values:
1
3
4
我需要加入这些 tables。
想要的结果:
T1 | T2
------|------
1 | 1
2 | null
null | 3
4 | 4
使用 JOIN 我可以轻松做到:
查询 1
SELECT * FROM T1 FULL JOIN T2 ON T1.id=T2.id
但是由于某些原因我不能在这里使用 JOIN。所以,像这样的简单查询
查询 2
SELECT * FROM T1, T2 WHERE T1.id=T2.id
我只会得到两行数据
T1 | T2
------|------
1 | 1
4 | 4
因为其他两行将被省略,因为其他行中没有匹配项 table。
不管用什么来填补缺失的匹配项。它可以是 NULL 或任何其他值 - 实际上是任何值,但我需要获取那些省略的行。
有没有办法在不使用任何 JOIN 的情况下修改查询 2 以获得所需的结果?
PS:真正的table结构不同,所以也不可以UNION。
PPS: 我刚刚给出了一个模型来指出问题。实际上,它是一个涉及许多 table 的“巨型查询”,每个查询都有几十列。
SELECT t1.id t1_id, t2.id t2_id
FROM ( SELECT id FROM table1
UNION DISTINCT
SELECT id FROM table2 ) t0
NATURAL LEFT JOIN table1 t1
NATURAL LEFT JOIN table2 t2
仅支持隐式联接时实现 FULL OUTER JOIN
的标准方法。
select t1.id t1id, t2.id t2id
from t1, t2 where t1.id = t2.id
union all
select id, null from t1
where not exists (select 1 from t2 where t2.id = t1.id)
union all
select null, id from t2
where not exists (select 1 from t1 where t1.id = t2.id)
order by coalesce(t1id, t2id)
第一个 SELECT
产生结果的 INNER JOIN
部分。
第二个 SELECT
将 其他 LEFT OUTER JOIN
行添加到结果中。
第三个 SELECT
将 附加 RIGHT OUTER JOIN
行添加到结果中。
一起,FULL OUTER JOIN
完成了!
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=ec154ad243efdff2162816205fdd42b5
我有两个 tables T1 和 T2,都有一个字段 (id)。
T1.id has values:
1
2
4
T2.id has values:
1
3
4
我需要加入这些 tables。
想要的结果:
T1 | T2
------|------
1 | 1
2 | null
null | 3
4 | 4
使用 JOIN 我可以轻松做到:
查询 1
SELECT * FROM T1 FULL JOIN T2 ON T1.id=T2.id
但是由于某些原因我不能在这里使用 JOIN。所以,像这样的简单查询
查询 2
SELECT * FROM T1, T2 WHERE T1.id=T2.id
我只会得到两行数据
T1 | T2
------|------
1 | 1
4 | 4
因为其他两行将被省略,因为其他行中没有匹配项 table。
不管用什么来填补缺失的匹配项。它可以是 NULL 或任何其他值 - 实际上是任何值,但我需要获取那些省略的行。
有没有办法在不使用任何 JOIN 的情况下修改查询 2 以获得所需的结果?
PS:真正的table结构不同,所以也不可以UNION。
PPS: 我刚刚给出了一个模型来指出问题。实际上,它是一个涉及许多 table 的“巨型查询”,每个查询都有几十列。
SELECT t1.id t1_id, t2.id t2_id
FROM ( SELECT id FROM table1
UNION DISTINCT
SELECT id FROM table2 ) t0
NATURAL LEFT JOIN table1 t1
NATURAL LEFT JOIN table2 t2
仅支持隐式联接时实现 FULL OUTER JOIN
的标准方法。
select t1.id t1id, t2.id t2id
from t1, t2 where t1.id = t2.id
union all
select id, null from t1
where not exists (select 1 from t2 where t2.id = t1.id)
union all
select null, id from t2
where not exists (select 1 from t1 where t1.id = t2.id)
order by coalesce(t1id, t2id)
第一个 SELECT
产生结果的 INNER JOIN
部分。
第二个 SELECT
将 其他 LEFT OUTER JOIN
行添加到结果中。
第三个 SELECT
将 附加 RIGHT OUTER JOIN
行添加到结果中。
一起,FULL OUTER JOIN
完成了!
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=ec154ad243efdff2162816205fdd42b5