Existe uma maneira de expressar uma relação vazia no SQL sem realmente criar uma tabela vazia?
Para fins de teste, quero encontrar uma maneira de testar algo como:
SELECT count(*) FROM (...) my_empty_table;
onde ...
gera uma tabela vazia em linha. (espero receber 0
como resposta)
Isso é possível?
Tentei sem sucesso:
SELECT count(*) FROM (VALUES) t;
SELECT count(*) FROM () t;
, que dão erros de sintaxe.
e
=> SELECT count(*) FROM (SELECT) t;
count
-------
1
(1 row)
(Estou usando principalmente SQL, mas também estou curioso para saber se existe uma maneira compatível com o padrão de escrever isso).
Sua última tentativa pode ser alterada para:
Que no entanto não é SQL padrão.
A única maneira que consigo pensar no SQL padrão é usar outra subseleção baseada em uma cláusula VALUES que não retorna nada:
Ou use uma interseção vazia:
Isso é SQL parcialmente padrão, porque uma cláusula FROM é exigida pelo padrão.
Para manter a conformidade com o padrão SQL, você pode usar uma tabela do esquema de informações . O manual:
Para simplificar, sugiro
information_schema.information_schema_catalog_name
. O manual:Minha ênfase em negrito . Então:
A
SELECT
lista pode estar vazia, pois não estamos interessados em colunas reais.Ou:
Mas
LIMIT
não é sintaxe padrão, que é:(Desnecessariamente verboso, se você me perguntar.)
SQL totalmente padrão, prova de conceito, mas de utilidade limitada. Nenhum dos RDBMS existentes cumpre totalmente o padrão.
Notavelmente, a Oracle não implementa o esquema de informações. E os RDBMS mais populares suportam a
LIMIT
cláusula não padrão do que o padrãoFETCH FIRST
. Visão geral na Wikipédia.A sintaxe não padrão mais curta e barata para o Postgres é o primeiro exemplo de a_horse .