首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在mysql中模拟嵌套查询的完全外连接

问在mysql中模拟嵌套查询的完全外连接
EN

Stack Overflow用户
提问于 2015-05-15 06:57:07
回答 1查看 587关注 0票数 0

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

EN

回答 1

Stack Overflow用户

发布于 2015-05-15 09:42:36

所以假设我想要模拟

代码语言:javascript
复制
SELECT * FROM A OUTER JOIN B USING(x)

使用表格

代码语言:javascript
复制
A                      B
x     y                x     z
---------              --------
1     2                1     Q
3     3                2     P
6     11               3     R

因此,在开始之前,我们执行一个LEFT JOIN来创建表

代码语言:javascript
复制
A LEFT JOIN B
x   y   z
-------------
1   2   Q
3   3   R
6   11  NULL

现在,我们将一个null条目附加到表中,如下所示:

代码语言:javascript
复制
(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

代码语言:javascript
复制
B UNION (SELECT NULL, NULL)
x     z
---------------------------
1     Q
2     P
3     R
NULL  NULL

如果我们将这两个表RIGHT JOIN在一起,我们将得到以下结果

代码语言:javascript
复制
((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一次。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30248834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档