哪些数据库支持联合连接(UNION JOIN)?

3
首先,这个项目对我来说有些好奇。 我正在编写一些代码用于实用库,并添加了运行不同类型的SQL连接语句的方法。 一切都很好,但在某个时候,我遇到了包含在SQL-92规范(第179页)中的晦涩的UNION JOIN子句。
我不知道它有多有用(我从未使用过),并且它只在HyperSQL中实现(据我所知)。
为了记录,以下是它的工作原理。 如果我们有两个表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

无论如何,我想知道哪些数据库实际上支持它,或者你是否在现实中见过。

我也在考虑询问它有什么好处,但我不想让这个问题被关闭为“主观性意见题”。


1
这不就是“OUTER UNION”吗? - Tom
@Tom 哇,这是另一种实现方式。不太标准,但没错。 - The Impaler
1个回答

5
理论上,任何 SQL 都支持它。
正如 "SQL Problems and Solutions" by Moiseenko 中所记录的那样:

这种连接类型已经在 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),可以通过左外连接和右外连接的联合获得。因此,我们的公式采用以下形式
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


我印象深刻。我以为我早就记住了92标准,但这个完全没印象。 - Gordon Linoff
谢谢,这是另一个支持这个过时SQL子句的数据库。你的解释很有道理。这个SQL子句看起来像是一个多余的结构。 - The Impaler
我看到了不支持的断言,声称MariaDB支持该子句,但是到目前为止在文档中找不到任何证据。 - DVK
@Gordon Linoff - 要记住那个标准将是一项相当了不起的壮举,因为它超过了600页(http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt)。 - dcp
@dcp... 我的团队当时正在编写数据库,我们必须了解所有细微差别。 - Gordon Linoff
Ocelot RDBMS曾支持这种类型的连接(UNION JOIN);它是由Peter Gulutzan开发的,他大约20年前加入了MySQL团队... https://www.ocelot.ca/ocelot.htm - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接