Isso funciona nos principais Sistemas de Gerenciamento de Banco de Dados de Relação com maior probabilidade de aparecer no StackOverflow / dba.stackexchange, sendo SQL Server, MySQL, PostgreSQL e SQLite (WebSQL) .
select 'abc' abc, 1 def;
Não funciona no Oracle. Por que precisamos selecionar DUAL no Oracle? O padrão ISO / ANSI para SQL requer uma cláusula FROM para instruções SELECT ?
Editar:
Por Bacon Bit
resposta, parece exigido pelo padrão SQL.
Então, na realidade, como o nome DUAL é um nome impróprio, se eu criar uma tabela e nomeá-la como ATOM ou ONE, por exemplo create table one (atom int);
... select 'abc' abc, 1 def FROM one;
- Existe uma penalidade de desempenho em comparação com SELECT .. FROM DUAL
?
select
sem umfrom
. O DB2 possui uma tabela fictícia semelhante chamada SYSIBM.SYSDUMMY1 . Você provavelmente já sabe disso, mas, quando vocêselect 'A' from dual
, adual
tabela não é realmente acessada , o que responde à pergunta em sua edição (que merecia uma nova pergunta).FROM
cláusula. Em cima da minha cabeça: Informix, Firebird e Apache Derby também exigem.values ('abc', 1)
. Obviamente, você também pode selecionar uma dessas afirmações:select abc from ( values ('abc',1) ) as t(abc,def)
Respostas:
Estritamente, sim, a
FROM
cláusula de umaSELECT
declaração não é opcional. A sintaxe do SQL-99 detalha aSELECT
declaração básica e aFROM
cláusula não possui colchetes. Isso indica que o padrão considera não opcional:No uso real, programadores e DBAs costumam achar útil fazer outras coisas além de manipular dados em tabelas ou manipular tabelas e estruturas de dados. Esse tipo de coisa está muito além do escopo do padrão SQL, que se preocupa mais com os recursos de dados do que com as porcas e parafusos de implementações específicas. Quer desejemos executar
SELECT getdate()
ouSELECT 1
ouSELECT DB_NAME()
(ou o que seu dialeto preferir), na verdade não queremos dados de uma tabela.A Oracle decide resolver a discrepância padrão e de implementação usando uma tabela fictícia com a seguinte definição efetiva:
Outros RDBMSs assumem essencialmente que uma tabela fictícia será usada se não
FROM
for especificado.A história da tabela DUAL está na Wikipedia:
fonte
A vantagem
dual
é que o otimizador entende quedual
é uma tabela especial de uma linha, uma coluna (comvarchar2
tipo de dados) - quando você o usa em consultas, ele usa esse conhecimento ao desenvolver o plano.Por que precisamos selecionar
dual
no Oracle?Você também pode selecionar de
dual
ou a partir de suas próprias tabelas, se desejar.Para mim, continuarei
dual
porque sei quedual
existe. Eu sei que tem pelo menos 1 e no máximo 1 linha. Eu sei que o otimizador sabe tudodual
e faz a coisa mais eficiente para mim. O otimizador entende quedual
é uma tabela mágica especial de 1 linha. Parou noselect *
porque há uma linha lá. Então é assim que funciona.fonte
DUAL
. Seja cuidadoso!As outras duas respostas fornecem bons antecedentes para a minha resposta.
Nos bancos de dados Oracle, é tradicional e confiável. Ele falhará em outros bancos de dados que não possuem uma
DUAL
tabela. Não é necessário que você useDUAL
, mas eu recomendaria.Os bancos de dados compatíveis com os padrões exigirão uma
FROM
cláusula que especifique pelo menos a referência da tabela. Se você tiver uma tabela ORDERS, a seguinte substituição para aFROM DUAL
cláusula funcionaria:Substitua qualquer tabela ou exibição da qual você possa selecionar e ele funcionará. Substitua uma tabela ou exibição da qual você não pode selecionar e ela falhará.
DUAL
é mais confiável, exceto quando um DBA é interrompido, todos os usuários podem selecionar e obterão apenas uma linha no conjunto de resultados. (Ele se quebra ocasionalmente.)Não conheço um verbo compatível com os padrões para acessar dados que não estão em uma tabela sem incluir uma referência a tabela. Dado o pouco acesso a esses dados, não vejo essa necessidade. Muitos dos casos em que encontro, podem ser melhor tratados de maneiras diferentes.
fonte
SELECT CURRENT_TIMESTAMP FROM (VALUES(1)) V(C)
é compatível com os padrões e acredito que não depende de nenhuma tabela específica.