Mysql没有FULL OUTER连接,我知道有很多方法可以emulate them using right and left joins。但是,我遇到的所有建议的方法都需要引用要连接两次的表。如果我使用一个大型的子查询,就无法引用该查询两次,因为mysql不支持CTE。有没有其他方法可以构造这个查询,而不涉及复制和粘贴我的大型子查询?
发布于 2015-05-15 09:42:36
所以假设我想要模拟
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现在,我们将一个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“行,它与A和B的OUTER JOIN相同。要删除额外的行,您需要额外的WHERE语句。还需要注意的是,这是基于NULL,而不是显示在您要合并的列中。
我还在研究SQL语法的细节,因为mysql抱怨命名子查询,但操作顺序理论上是正确的,并且只访问表A一次。
https://stackoverflow.com/questions/30248834
复制相似问题