Me resulta difícil convertir los procedimientos almacenados de SQL Server a Oracle para que nuestro producto sea compatible con él.
Tengo consultas que devuelven el registro más reciente de algunas tablas, basado en una marca de tiempo:
Servidor SQL:
SELECT TOP 1 *
FROM RACEWAY_INPUT_LABO
ORDER BY t_stamp DESC
=> Eso me devolverá el registro más reciente
Pero Oracle:
SELECT *
FROM raceway_input_labo
WHERE rownum <= 1
ORDER BY t_stamp DESC
=> ¡Eso me devolverá el registro más antiguo (probablemente según el índice), independientemente de la ORDER BY
declaración!
Encapsulé la consulta de Oracle de esta manera para que coincida con mis requisitos:
SELECT *
FROM
(SELECT *
FROM raceway_input_labo
ORDER BY t_stamp DESC)
WHERE rownum <= 1
y funciona. Pero me parece un truco horrible, especialmente si tengo muchos registros en las tablas involucradas.
Cuál es la mejor manera de lograr esto ?
sql
oracle
sql-order-by
rownum
Larry
fuente
fuente
Respuestas:
La
where
declaración se ejecuta antes de laorder by
. Entonces, su consulta deseada dice " tome la primera fila y luegot_stamp
ordénela por desc ". Y eso no es lo que pretendes.El método de subconsulta es el método adecuado para hacer esto en Oracle.
Si desea una versión que funcione en ambos servidores, puede usar:
El exterior
*
devolverá "1" en la última columna. Debería enumerar las columnas individualmente para evitar esto.fuente
Usar en su
ROW_NUMBER()
lugar.ROWNUM
es una pseudocolumna yROW_NUMBER()
es una función. Puede leer sobre la diferencia entre ellos y ver la diferencia en la salida de las consultas a continuación:fuente
ROWNUM
podría ser más rápido queROW_NUMBER()
eso si uno debe usar uno sobre el otro depende de una serie de factores.Una alternativa que sugeriría en este caso de uso es usar el MAX (t_stamp) para obtener la última fila ... por ejemplo
Mi preferencia de patrón de codificación (tal vez), confiable, generalmente funciona mejor o mejor que tratar de seleccionar la primera fila de una lista ordenada, también la intención es más explícitamente legible.
Espero que esto ayude ...
SQLer
fuente
Se documentaron algunos problemas de diseño con esto en un comentario anterior. En pocas palabras, en Oracle, debe limitar los resultados manualmente cuando tiene tablas grandes y / o tablas con los mismos nombres de columna (y no desea escribirlas explícitamente y cambiarles el nombre). La solución fácil es averiguar su punto de interrupción y limitarlo en su consulta. O también puede hacer esto en la consulta interna si no tiene la restricción de nombres de columna en conflicto. P.ej
reducirá sustancialmente los resultados. Luego puede ORDER BY o incluso hacer la consulta externa para limitar las filas.
Además, creo que TOAD tiene una función para limitar las filas; pero, no estoy seguro de que eso limite dentro de la consulta real en Oracle. No estoy seguro.
fuente