有没有办法在 SQL 中表达一个空关系而不实际创建一个空表?
出于测试目的,我想找到一种方法来测试以下内容:
SELECT count(*) FROM (...) my_empty_table;
where 内...
联生成一个空表。(我希望得到0
答案)
这可能吗?
我尝试不成功:
SELECT count(*) FROM (VALUES) t;
SELECT count(*) FROM () t;
,这会产生语法错误。
和
=> SELECT count(*) FROM (SELECT) t;
count
-------
1
(1 row)
(我主要使用 SQL,但我也很好奇是否有符合标准的编写方式)。
您的最后一次尝试可以更改为:
然而,这不是标准 SQL。
在标准 SQL 中我能想到的唯一方法是使用另一个基于 VALUES 子句的子选择,该子句不返回任何内容:
或者使用一个空的交叉点:
这是部分标准 SQL,因为标准需要 FROM 子句。
为了保持 SQL 标准兼容,您可以使用信息模式中的表。手册:
为简单起见,我建议
information_schema.information_schema_catalog_name
. 手册:大胆强调我的。所以:
该
SELECT
列表可以是空的,因为无论如何我们对实际的列都不感兴趣。或者:
但
LIMIT
不是标准语法,即:(不必要的冗长,如果你问我的话。)
完全标准的 SQL,概念证明,但用途有限。现有的 RDBMS 都没有完全符合标准。
值得注意的是,Oracle 没有实现信息模式。并且比标准更流行的 RDBMS 支持非标准
LIMIT
子句FETCH FIRST
。维基百科中的概述。Postgres 最短和最便宜的非标准语法是a_horse 的第一个示例。