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

在mysql中模拟嵌套查询的完整外部联接,mysql,sql,join,Mysql,Sql,Join,Mysql没有完整的外部连接,我知道有很多方法可以实现。但是,我遇到的所有建议方法都需要引用两次要连接的表。如果我使用的是一个大型子查询,那么就无法引用该查询两次,因为mysql不支持CTE。有没有其他方法可以构造这个查询,而不需要复制和粘贴我的大子查询?所以假设我想模拟一下 SELECT * FROM A OUTER JOIN B USING(x) 用桌子 A B x y x z ---------

Mysql没有
完整的外部连接,我知道有很多方法可以实现。但是,我遇到的所有建议方法都需要引用两次要连接的表。如果我使用的是一个大型子查询,那么就无法引用该查询两次,因为mysql不支持CTE。有没有其他方法可以构造这个查询,而不需要复制和粘贴我的大子查询?

所以假设我想模拟一下

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
首先,我们做一个
左连接
,创建表

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
如果我们将这两个表右键连接在一起,我们将得到以下结果

((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的
外部联接
相同。要删除额外的行,需要额外的WHERE语句。还需要注意的是,这是基于NULL没有显示在您合并的列中


我仍在研究SQL语法的细节,因为mysql抱怨子查询的命名,但操作顺序理论上是正确的,只访问表A一次。

与创建临时表相反,将子查询加载到该表,必要时进行索引,然后右/左连接?我的第一个反射是“使用公共表表达式”,但MySql两者都不使用。因此,您可能应该切换到临时表。@如果您建议使用true
临时表,MySql对它们的使用有限制,几乎总是需要为此创建两个副本。然而,“fake”临时表(即完成后放下的桌子)工作得相当好,并且可以提供一个有利的选择,即在使用前能够向中间数据添加适当的索引。在我看来,您关于只对两个表进行一次访问而进行连接的问题是一个严重的理论问题。我已经挠头一个小时了,没有发现任何不严重依赖分析功能的东西nctions与笛卡尔乘积一起使用。也就是说,MySql支持的更少。我应该注意,在我的特殊情况下,只有一个表是子查询。我试图在与另一个表进行两次连续联接的情况下编写一些东西,但我无法实现。