2011-05-17 10 views

Respuesta

5

Utilizando puntas @Adrian, he encontrado una solución:

estoy usando GRUPO POR CUENTA y . He intentado utilizar DISTINCT con ORDER BY pero yo estoy mensaje de error: "no es una expresión seleccionada"

select id from 
(
    SELECT id FROM a -- returns 1,4,2,3 
    UNION ALL -- changed to ALL 
    SELECT id FROM b -- returns 2,1 
) 
GROUP BY id ORDER BY count(id); 

Gracias Adrian y this blog.

+0

Si quieres primero las filas "b", ¿no quieres COUNT (id) DESC? Además, esto solo funciona si "b" es un subconjunto de los registros en "a". Finalmente, no puede confiar en que los registros de "b" o "a" se hayan ordenado de alguna manera particular, dado este ejemplo en particular. Cuando probé esto, obtuve 1,2,4,3 para la salida. – DCookie

+0

a) Sí, en este ejemplo necesito DESC (se me olvidó poner). Pero en mi aplicación lo necesito al final de la mesa. b) no hay problema, en mi aplicación, la tabla 'b' es un subconjunto de' a'. c) De acuerdo, no importa en qué orden entra Cames en los originales. Count hace el trabajo :) – Topera

+0

Estás listo para partir ;-) Pensé que obtendrías la respuesta que necesitabas, principalmente quería señalar a otros algunas cosas que debes tener en cuenta en esta solución. Creo que el uso de COUNT aquí es astuto. – DCookie

24

usted quiere hacer esto:

select * from 
(
    SELECT id, 2 as ordered FROM a -- returns 1,4,2,3 
    UNION 
    SELECT id, 1 as ordered FROM b -- returns 2,1 
) 
order by ordered 

actualización

me di cuenta de que a pesar de que tiene dos tablas diferentes, se une a la ID de , eso significa que si tiene 1 en ambas tablas, obtendrá una sola ocurrencia. Si ese es el comportamiento deseado, debe apegarse al UNION. Si no, cambie a UNION ALL.

Así que también cuenta de que si cambia al código he propuesto, debería empezar a recibir tanto 1 y 2 (tanto a y b). En ese caso, es posible que desee cambiar el código propuesto:

select distinct id from 
(
    SELECT id, 2 as ordered FROM a -- returns 1,4,2,3 
    UNION 
    SELECT id, 1 as ordered FROM b -- returns 2,1 
) 
order by ordered 
+0

+1 Y podría omitir el alias de columna en la segunda parte de la unión – Andomar

+0

Sí, lo sé. Pero en SO tienes que ser rápido :) –

+0

¡Fue rápido y perfecto! ¡Gracias, hombre! – Topera

0
SELECT id, 1 AS sort_order 
    FROM b 
UNION 
SELECT id, 2 AS sort_order 
    FROM a 
MINUS 
SELECT id, 2 AS sort_order 
    FROM b 
ORDER BY 2; 
1

@ respuesta de Adrian es perfectamente adecuado, sólo quería compartir otra forma de lograr el mismo resultado:

select nvl(a.id, b.id) 
from a full outer join b on a.id = b.id 
order by b.id; 
1

@ respuesta de Adrien no está funcionando. Da un ORA-01791.

La respuesta correcta (para la pregunta que se hace) debería ser:

select id 
from 
(SELECT id, 2 as ordered FROM a -- returns 1,4,2,3 
    UNION ALL 
    SELECT id, 1 as ordered FROM b -- returns 2,1 
) 
group by id 
order by min(ordered) 

Explicación:

  1. El "UNION ALL" es la combinación de los 2 conjuntos. Una "UNIÓN" es derrochadora porque los 2 conjuntos no pueden ser iguales, porque el campo ordenado es diferente.
  2. El "grupo por" es entonces la eliminación de duplicados
  3. El "orden por min (ordenado)" está asegurando los elementos de la Tabla B son primero

Esto resuelve todos los casos, incluso cuando la Tabla B tiene más o diferentes elementos luego tabla a

Cuestiones relacionadas