哪些数据库支持UNION JOIN?

时间:2019-05-28 14:02:29

标签: sql database union-join

首先,这对我来说就像是好奇。

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

我不知道它有多有用(我从未使用过),并且仅在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

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

我当时也在考虑问它有什么好处,但我不希望以“基于主要观点”来解决这个问题。

1 个答案:

答案 0 :(得分: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