2009-11-09 14 views
7

Estoy tratando de armar una consulta que mostrará un registro específico (encontrado por el ID principal del registro) en la parte superior, y mostrará todos los demás registros debajo de él, ordenados por fecha (tengo "fecha_agregada" como uno de los campos de la tabla, además de la identificación principal).SQL para tener un registro específico en la parte superior, todos los demás por debajo de

Podría hacer esto con un UNION (la primera selección localizaría el registro que quiero, y el otro seleccionar mostraría todos los demás registros), pero me pregunto si existe tal vez una mejor manera?

Estoy usando Oracle, por cierto.

Respuesta

17

Usted puede hacer esto mediante la clasificación por dos campos

La primera sería una expresión que devuelve 0 si la fila es el que usted desea o 1 si ISN 't. Ordenar será ascendente para que obtenga su registro preferido primero.

El segundo campo de ordenación sería date_added, por lo que los registros restantes se ordenan en este orden.

temo que no sé por Oracle en el servidor SQL sería algo así como

select * 
from the_table 
order by (case id when 999 then 0 else 1 end), date_added desc 
+0

Gracias por la respuesta. ¿Qué significa "ordenar por 0" por cierto? Me di cuenta de que no puedo usar esto solo, p. solo "PEDIDO POR 0". (Tengo el error: "El elemento ORDER BY debe ser el número de una expresión SELECT-list") – Dario

+1

'ORDER BY ' tiene un significado especial en Oracle, clasificará en la enésima columna. Por supuesto, nunca hay una 0ª columna. Con CASE, agregará una nueva columna a cada fila y ordenará eso. La nueva columna será 1 para la clave primaria coincidente y 0 en todas partes. – Andomar

1

No sé exactamente Oracle, pero tal vez podría hacer algo así ..

ORDER BY IF(id == THE_ID, 0, 1), date_added 
+0

+1 ¡Sin embargo, no estoy seguro si Oracle soporta IF de esa manera! – Andomar

+0

Oracle no admite IIF, pero puede 'DECODE (id, THE_ID, 0,1)' en su lugar – Andomar

7

Una forma más fácil sería un fin de fantasía por el constructo. He aquí un ejemplo de pk = 123:

select * 
from YourTable 
order by case when yourpk = 123 then 1 else 2 end, date_added 
+0

esto pondría el registro específico al final, debería ser "... then 1 else 2 end ..." –

+0

@ammoQ: Gracias, respuesta editada (reko_t publicó la misma idea antes) – Andomar

-1

La forma más sencilla sería la de reconocer que desea mostrar dos cosas separadas y por lo tanto escribir para separar las consultas directas. Una consulta para recuperar el primer registro y la segunda para recuperar la lista ordenada. No hay una ventaja de rendimiento real para hacer algo más que esto debido a un único registro.

+0

Sí, pero hay ventajas de hacerlo como una declaración SQL única. Algunos entornos (por ejemplo, las suites de informes) no permiten la fácil reutilización de las construcciones de SQL, por lo que podría tener que repetir la mayor parte del SQL dos veces, lo que es problemático para el mantenimiento. Además, hacerlo en SQL es más consise :-). – sleske

0
SELECT * 
FROM `Table` 
ORDER BY (`id` = THE_ID) DESC, `date_added` DESC 
0

Puede ordenar más de un registro a la parte superior utilizando la misma técnica

999 primera 998 segundos seguido por todo lo demás, ordenados por fecha

seleccione *

from the_table 
order by (case id when 999 then 0 when 998 then 1 else 2 end), date_added desc 
Cuestiones relacionadas