Considere estas tablas (código estándar SQL, se ejecuta en SQL Server 2008):
WITH A
AS
(
SELECT *
FROM (
VALUES (1),
(2),
(3),
(4),
(5),
(6)
) AS T (col)
),
B
AS
(
SELECT *
FROM (
VALUES (9),
(8),
(7),
(6),
(5),
(4)
) AS T (col)
), ...
El efecto deseado es este para ordenar la tabla A
por col
ascendente, una especie de mesa B
por col
descendiendo luego unificante los dos, eliminar duplicados, conservar el orden antes de la unión y dejar los resultados de la tabla A
en la "parte superior" con la tabla B
en la parte inferior, por ejemplo (Código Pesudo)
(
SELECT *
FROM A
ORDER
BY col
)
UNION
(
SELECT *
FROM B
ORDER
BY col DESC
);
Por supuesto, esto no funcionará en SQL porque no sólo puede haber un ORDER BY
cláusula y que sólo se puede aplicar a la expresión de tabla de nivel superior (o cualquiera que sea el resultado de una consulta SELECT
es conocido como; lo llamo el "conjunto de resultados").
Lo primero a tratar es la intersección entre las dos tablas, en este caso los valores 4
, 5
y 6
. ¡Cómo se debe ordenar la intersección debe especificarse en el código SQL, por lo tanto, es deseable que el diseñador también lo especifique! (es decir, la persona que hace la pregunta, en este caso).
La implicación en este caso, parece ser que la intersección ("duplicados") deben clasificarse dentro de los resultados de la tabla A. Por lo tanto, el conjunto de resultados ordenada debe tener este aspecto:
VALUES (1), -- A including intersection, ascending
(2), -- A including intersection, ascending
(3), -- A including intersection, ascending
(4), -- A including intersection, ascending
(5), -- A including intersection, ascending
(6), -- A including intersection, ascending
(9), -- B only, descending
(8), -- B only, descending
(7), -- B only, descending
Nota de SQL "superior" e "inferior" no tienen un significado diferente y una tabla (que no sea un conjunto de resultados) no tiene un orden inherente. Además (para abreviar, considere que UNION
elimina las filas duplicadas por implicación y debe aplicarse antes de ORDER BY
. La conclusión debe ser que el orden de clasificación de cada tabla debe definirse explícitamente al exponer una (s) columna (s) de orden de clasificación antes de que estén unidas. Para esto, podemos usar la función de ventana ROW_NUMBER()
, p.
...
A_ranked
AS
(
SELECT col,
ROW_NUMBER() OVER (ORDER BY col) AS sort_order_1
FROM A -- include the intersection
),
B_ranked
AS
(
SELECT *,
ROW_NUMBER() OVER (ORDER BY col DESC) AS sort_order_1
FROM B
WHERE NOT EXISTS ( -- exclude the intersection
SELECT *
FROM A
WHERE A.col = B.col
)
)
SELECT *, 1 AS sort_order_0
FROM A_ranked
UNION
SELECT *, 2 AS sort_order_0
FROM B_ranked
ORDER BY sort_order_0, sort_order_1;
¿QUÉ proveedor SQL es esto? No creo que el estándar requiera que 'UNION ALL' ordene nada, de hecho, el hecho de que no lo clasifique es lo que lo hace una mejor opción que simplemente 'UNION' – Romain
@MikaelEriksson: Eso es lo que dijo OP (aunque en un orden desordenado) Él quiere hacer una UNIÓN pero no tiene la clasificación implícita. – mwan
@mwan - Tienes razón. Leí mal la pregunta. –