首先,这对我来说就像是好奇。
我正在为实用程序库编写一些代码,并添加了一些方法来运行各种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
无论如何,我想知道哪些数据库确实支持它,或者您是否曾经在野外看到它。
我当时也在考虑问它有什么好处,但我不希望以“基于主要观点”来解决这个问题。
答案 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