“(SELECT * FROM A)”的冗长?

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)给我们带来了什么?什么时候需要长表格?

ype*_*eᵀᴹ 7

如果您想在 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)