The*_*ler 3 sql database 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
Run Code Online (Sandbox Code Playgroud)
然后:
select * from T union join U
Run Code Online (Sandbox Code Playgroud)
产生(没有特定的行顺序):
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
Run Code Online (Sandbox Code Playgroud)
无论如何,我想知道哪些数据库确实支持它,或者您是否曾经在野外看到它。
我当时也在考虑问它有什么好处,但是我不希望这个问题以“基于首要观点”结束。
从理论上讲,任何 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)
Run Code Online (Sandbox Code Playgroud)
如果DBMS不支持FULL JOIN(MySQL),则可以通过左右外部联接的联合来获得它。因此我们的公式采用以下形式
A UNION JOIN B :=
((A LEFT JOIN B)
UNION
(A RIGHT JOIN B))
EXCEPT
(A INNER JOIN B)
Run Code Online (Sandbox Code Playgroud)
实际上,SAS至少支持9.3版。参考:http : //support.sas.com/documentation/cdl/zh-CN/sqlproc/63043/HTML/default/viewer.htm#p0o4a5ac71mcchn1kc1zhxdnm139.htm
| 归档时间: |
|
| 查看次数: |
51 次 |
| 最近记录: |