tin*_*lyx 5 postgresql relational-algebra
这可能是一个新手问题。但有时,我发现有必要使用诸如(SELECT * FROM A)在 SQL 中进行关系代数之类的东西(而不是使用关系A本身)。
例如,尝试在工作时,UNION两种关系A,并B具有相同的结构,下面
SELECT * FROM (A UNION B) t;
Run Code Online (Sandbox Code Playgroud)
生成语法错误(使用 PostgreSQL 9.x)。
ERROR: syntax error at or near "UNION"
Run Code Online (Sandbox Code Playgroud)
我不得不做
SELECT * FROM ((SELECT * FROM A) UNION (SELECT * FROM B)) t;
Run Code Online (Sandbox Code Playgroud)
我的问题是:
子查询的冗长性(SELECT * FROM A)在 SQL 语言中是否真的必要(或者我是否遗漏了一些更好的编写方式)?为什么这里不能直接使用A和关系B?
是(SELECT * FROM A)相当于A在关系代数?扩张(SELECT * FROM A)给我们带来了什么?什么时候需要长表格?
如果您想在 SQL 中使用更短的TABLE name语法,可以使用以下语法- 其中name是表名(基表或视图或 cte):
SELECT * FROM ((TABLE A) UNION (TABLE B)) t ;
Run Code Online (Sandbox Code Playgroud)
不需要括号:
SELECT * FROM (TABLE A UNION TABLE B) t ;
Run Code Online (Sandbox Code Playgroud)
你甚至可以写:
TABLE A UNION TABLE B ;
Run Code Online (Sandbox Code Playgroud)
关于语法是否为 ISO/ANSI SQL,我在 SQL 2011 的一个(副本)草案中发现了这一点:
6.41 <multiset value constructor>
功能
指定多重集的构造。
格式
<multiset value constructor> ::=
<multiset value constructor by enumeration>
| <multiset value constructor by query>
| <table value constructor by query>
<multiset value constructor by enumeration> ::=
MULTISET <left bracket or trigraph> <multiset element list> <right bracket or trigraph>
<multiset element list> ::=
<multiset element> [ { <comma> <multiset element> }... ]
<multiset element> ::=
<value expression>
<multiset value constructor by query> ::=
MULTISET <table subquery>
<table value constructor by query> ::=
TABLE <table subquery>
Run Code Online (Sandbox Code Playgroud)