Mysql没有FULL OUTER
个连接,我知道有emulate them using right and left joins的方法。但是,我遇到的所有建议方法都需要引用您要连接两次的表。如果我使用大型子查询,则无法引用该查询两次,因为mysql不支持CTE。有没有其他方法可以构建此查询,不涉及复制和粘贴我的大子查询?
答案 0 :(得分:0)
假设我想模仿
SELECT * FROM A OUTER JOIN B USING(x)
使用表格
A B
x y x z
--------- --------
1 2 1 Q
3 3 2 P
6 11 3 R
首先,我们开始LEFT JOIN
创建表格
A LEFT JOIN B
x y z
-------------
1 2 Q
3 3 R
6 11 NULL
现在我们向表中附加一个空条目,如下所示:
(A LEFT JOIN B) UNION (SELECT NULL,NULL,NULL)
x y z
-------------
1 2 Q
3 3 R
6 11 NULL
NULL NULL NULL
然后我们使用相同的技术将空列附加到B
B UNION (SELECT NULL, NULL)
x z
---------------------------
1 Q
2 P
3 R
NULL NULL
如果我们RIGHT JOIN
将这两个表放在一起,我们将得到以下内容
((A LEFT JOIN B USING(x)) UNION (SELECT NULL,NULL,NULL)) RIGHT JOIN (B UNION SELECT NULL,NULL) USING (x)
x y z1 z2
-------------------
1 2 Q Q
NULL NULL NULL P
3 3 R R
6 11 NULL NULL
NULL NULL NULL NULL
如果我们忽略列z1和额外的" NULL" row,与A和B的OUTER JOIN
相同。要删除额外的行,需要额外的WHERE语句。另外需要注意的是,这是基于NULL未显示在要合并的列中。
我还在研究SQL语法的细节,因为mysql抱怨命名子查询,但操作顺序在理论上是正确的,并且只访问表A一次。