Eu quero usar a sintaxe do oracle para selecionar apenas 1 linha da tabela DUAL
. Por exemplo, desejo executar esta consulta:
SELECT user
FROM DUAL
... e teria, tipo, 40 registros. Mas preciso apenas de um registro. ... E, eu quero que isso aconteça sem uma WHERE
cláusula.
Preciso de algo no campo table_name, como:
SELECT FirstRow(user)
FROM DUAL
dual
?dual
é a tabela do sistema no oracleDUAL
. É um pouco como#define TRUE 0
em C - claro, pode funcionar para você, mas os futuros desenvolvedores irão odiar você.select user from dual
? Se não, tente fazer isso e veja o que você ganha. Em um sistema oracle padrão, você receberá de volta o usuário com o qual está executando o comando.Respostas:
Você usa ROWNUM.
ie.
http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm
fonte
order by
.ORDER BY
é aplicado após oWHERE
.SELECT * FROM (SELECT user FROM Employees ORDER BY SALARY DESC) WHERE ROWNUM <= 10
Encontrei essa "solução" escondida em um dos comentários. Já que estava pesquisando por um tempo, gostaria de destacar um pouco (ainda não posso comentar ou fazer esse tipo de coisa ...), então usei assim:
Isso me imprimirá a entrada [Coluna] desejada da entrada mais recente na tabela, supondo que [Data] seja sempre inserida via SYSDATE.
fonte
ROWID
, desde que você nunca exclua nenhum registro e sempre se preocupe com o último inserido / modificado.ROWID
é modificado aleatoriamente pelo Oracle. Não é. Baseia-se na modificação real das linhas, ou seja, você exclui uma e depois insere outra. O inserido obterá o antigoROWID
. Existem coisas como tabelas estáticas que nunca são atualizadas - como os estados nos Estados Unidos são um bom exemplo - onde, se mudasse, provavelmente teria outras repercussões, de qualquer maneira, quando isso é bom.ROWID
possa ser alterado, um bom DBA iria procurá-la e fazer o que pudesse para evitá-la se houvesse a possibilidade de estarem afetando uma tabela estática, como descrevi. apenas o aplicativo deve estar operando. Uma exportação de tabela pode ser feita com umaSELECT
instrução, em vez disso. A importação aconteceria uma vez e nunca mais. Entendi, é definitivamente necessário cuidado, mas os problemas estão longe de ser inevitáveis.Esta sintaxe está disponível no Oracle 12c:
^^ Eu só queria demonstrar que tanto a linha quanto as linhas (plural) podem ser usadas independentemente da pluralidade do número de linhas desejado.)
fonte
temos 3 opções para obter a primeira linha na tabela Oracle DB.
1)
select * from table_name where rownum= 1
é a melhor maneira2)
select * from table_name where id = ( select min(id) from table_name)
3)
fonte
Pelo que eu sei, a
dual
tabela no Oracle é uma tabela especial com apenas uma linha. Então, isso seria suficiente:fonte
👌 A resposta é:
Você deve usar a consulta aninhada como:
=> Em PL / SQL "ROWNUM = 1" NÃO é igual a "TOP 1" de TSQL.
Portanto, você não pode usar uma consulta como esta: "select * from any_table_x where rownum = 1 order by any_column_x;" Como o oracle obtém a primeira linha, aplica ordem por cláusula.
fonte
rownum = 1
, mas não devemos permitir que bugs antigos afetem nosso código mais.Não há
limit 1
condição (isso é MySQL / PostgresSQL) no Oracle, você precisa especificarwhere rownum = 1
.fonte
"FirstRow" é uma restrição e, portanto, é colocada na
where
cláusula e não naselect
cláusula. E é chamado de rownumfonte
ORDER BY
, já que o pedido só acontece após a cláusula where. Em outras palavras, para obter o topo de uma determinada consulta classificada, o rownum é totalmente inútil.Where
com uma consulta de visualização.SELECT * FROM (SELECT * FROM ... WHERE ... ORDER BY ...) WHERE ROWNUM = 1
? Bem, isso pode funcionar, mas parece muito idiota, tbh.Se qualquer linha servir, tente:
Nenhuma cláusula where.
fonte
fonte
select a.user from (select user from users order by user) a where rownum = 1
terá o melhor desempenho, outra opção é:
em cenários em que você deseja subconjuntos diferentes, mas acho que você também pode usar
RANK()
Mas, também gosto,row_number()
over(...)
pois nenhum agrupamento é necessário.fonte
Se você deseja recuperar apenas a primeira linha de um resultado classificado com o mínimo de subconsultas, tente o seguinte:
fonte
Mais flexível do que
select max()
é:fonte