在mysql中模拟嵌套查询的完整外连接

时间:2015-05-14 22:57:07

标签: mysql sql join

Mysql没有FULL OUTER个连接,我知道有emulate them using right and left joins的方法。但是,我遇到的所有建议方法都需要引用您要连接两次的表。如果我使用大型子查询,则无法引用该查询两次,因为mysql不支持CTE。有没有其他方法可以构建此查询,不涉及复制和粘贴我的大子查询?

1 个答案:

答案 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一次。