Quiero usar la sintaxis de Oracle para seleccionar solo 1 fila de la tabla DUAL
. Por ejemplo, quiero ejecutar esta consulta:
SELECT user
FROM DUAL
... y tendría como 40 registros. Pero solo necesito un registro. ... Y quiero que suceda sin una WHERE
cláusula.
Necesito algo en el campo table_name como:
SELECT FirstRow(user)
FROM DUAL
dual
?dual
es la tabla del sistema enDUAL
. Es un poco como#define TRUE 0
en C: seguro, podría funcionar para usted, pero los futuros desarrolladores lo odiarán.select user from dual
? Si no es así, inténtelo y vea lo que obtiene. En un sistema Oracle estándar, recuperará el usuario con el que está ejecutando el comando.Respuestas:
Usas ROWNUM.
es decir.
http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm
fuente
order by
.ORDER BY
se aplica después deWHERE
.SELECT * FROM (SELECT user FROM Employees ORDER BY SALARY DESC) WHERE ROWNUM <= 10
Encontré esta "solución" oculta en uno de los comentarios. Como lo estuve buscando por un tiempo, me gustaría resaltarlo un poco (aún no puedo comentar o hacer esas cosas ...), así que esto es lo que usé:
Esto me imprimirá la entrada de [Columna] deseada de la entrada más reciente en la tabla, asumiendo que [Fecha] siempre se inserta a través de SYSDATE.
fuente
ROWID
, siempre que nunca elimine ningún registro y siempre se preocupe por el último insertado / modificado.ROWID
Oracle lo modifica aleatoriamente. No lo es. Se basa en modificar realmente las filas, es decir, borra una y luego inserta una. El insertado obtendrá el anteriorROWID
. Hay cosas como tablas estáticas que nunca se actualizan, como los estados en los EE. UU. Es un buen ejemplo, donde si cambia, probablemente tendría otras repercusiones, de todos modos, cuando esto está bien.ROWID
que se pueda cambiar, un buen administrador de base de datos los buscaría y haría lo que pudiera para evitarlos si existiera la posibilidad de que estuvieran afectando una tabla estática como la que describí. solo la aplicación debería estar funcionando. En su lugar, se puede realizar una exportación de tabla con unaSELECT
declaración. La importación ocurriría una vez y nunca más. Entiendo su punto, definitivamente se necesita cuidado, pero los problemas están lejos de ser inevitables.Esta sintaxis está disponible en Oracle 12c:
^^ Solo quería demostrar que se pueden usar filas o filas (plural) independientemente de la pluralidad del número deseado de filas).
fuente
tenemos 3 opciones para obtener la primera fila en la tabla Oracle DB.
1)
select * from table_name where rownum= 1
es la mejor manera2)
select * from table_name where id = ( select min(id) from table_name)
3)
fuente
Hasta donde yo sé, la
dual
tabla en Oracle es una tabla especial con solo una fila. Entonces, esto sería suficiente:fuente
👌 La respuesta es:
Debería utilizar consultas anidadas como:
=> En PL / SQL, "ROWNUM = 1" NO es igual a "TOP 1" de TSQL.
Por lo tanto, no puede usar una consulta como esta: "seleccione * de cualquier_tabla_x donde rownum = 1 pedido por cualquier_columna_x;" Debido a que Oracle obtiene la primera fila, luego aplica orden por cláusula.
fuente
rownum = 1
, pero no deberíamos permitir que los errores antiguos afecten más nuestro código.No hay ninguna
limit 1
condición (eso es MySQL / PostgresSQL) en Oracle, debe especificarwhere rownum = 1
.fuente
"FirstRow" es una restricción y, por lo tanto, se encuentra en la
where
cláusula, no en laselect
cláusula. Y se llama rownumfuente
ORDER BY
, ya que el pedido solo ocurre después de la cláusula where. En otras palabras, para obtener la parte superior de una determinada consulta ordenada, rownum es completamente inútil.Where
con una consulta de View.SELECT * FROM (SELECT * FROM ... WHERE ... ORDER BY ...) WHERE ROWNUM = 1
? Bueno, eso puede funcionar, pero parece bastante tonto, tbh.Si cualquier fila sirve, intente:
No cláusula donde.
fuente
fuente
select a.user from (select user from users order by user) a where rownum = 1
funcionará mejor, otra opción es:
en escenarios donde desea diferentes subconjuntos, pero supongo que también podría usar
RANK()
Pero, también me gusta,row_number()
over(...)
ya que no se requiere agrupación.fuente
Si desea recuperar solo la primera fila de un resultado ordenado con la menor cantidad de subconsultas, intente esto:
fuente
Más flexible de lo que
select max()
es:fuente