首页 > 解决方案 > 哪些数据库支持 UNION JOIN?

问题描述

首先,这个项目对我来说就像一个好奇心。

我正在为实用程序库编写一些代码,并添加方法来运行不同类型的 SQL 连接语句。一切都很好,但在某些时候,我遇到UNION JOIN了 SQL-92 规范(第 179 页)中包含的晦涩条款。

我不知道它有多有用(我从未使用过它)并且它仅在 HyperSQL 中实现(AFAIK)。

为了记录,这是它的工作原理。如果我们有两个表 T 和 U 具有任意数量的列/行:

====== T =====       === U ===

   a    b    c          d    e
---- ---- ----       ---- ----
   1    2    3         10   11
   4    5    6         12   13

然后:

select * from T union join U  

产生(没有特定的行顺序):

   a    b    c    d    e
---- ---- ---- ---- ----
   1    2    3 null null
   4    5    6 null null 
null null null   10   11
null null null   12   13

无论如何,我想知道哪些数据库确实支持它,或者你是否在野外看到过它。

我也在考虑问它有什么好处,但我不希望这个问题被关闭为“主要基于意见”。

标签: sqldatabaseunion-join

解决方案


理论上,任何SQL 都支持它

正如Moiseenko 在“SQL 问题和解决方案”中所述

这种连接类型在 SQL-92 语言标准中已经引入,但在以后的 SQL 标准版本中消失了。特别是 SQL2003(ANSI 和 ISO)中没有它。与SQL的许多其他结构一样,UNION JOIN是多余的,因为它可以表示为全外连接和内连接的减法。形式上,我们可以将这个表达式写成如下:

A UNION JOIN B :=
(A FULL JOIN B)
EXCEPT
(A INNER JOIN B)

如果 DBMS 不支持 FULL JOIN(MySQL),可以通过左右外连接的 union 获得。所以我们的公式采用以下形式

A UNION JOIN B :=
((A LEFT JOIN B)
UNION
(A RIGHT JOIN B))
EXCEPT
(A INNER JOIN B)

实际上,SAS 至少支持 9.3 版。参考: http: //support.sas.com/documentation/cdl/en/sqlproc/63043/HTML/default/viewer.htm#p0o4a5ac71mcchn1kc1zhxdnm139.htm


推荐阅读