SQL Server: ORDER BY en la sub consulta con UNION
-
02-10-2019 - |
Pregunta
he dos consultas de ser combinados con un UNION ALL
1 :
--Query 1
SELECT Flavor, Color
FROM Friends
--Query 2
SELECT Flavor,
(SELECT TOP 1 Color
FROM Rainbows
WHERE Rainbows.StrangerID = Strangers.StrangerID
ORDER BY Wavelength DESC
) AS Color
FROM Strangers
Ambos de los cuales, por supuesto, funcionan bien por separado, pero cuando se combina con un UNION ALL
:
SELECT Flavor, Color
FROM Friends
UNION ALL
SELECT Flavor,
(SELECT TOP 1 Color
FROM Rainbows
WHERE Rainbows.StrangerID = Strangers.StrangerID
ORDER BY Wavelength DESC
) AS Color
FROM Strangers
La consulta falla con el error:
Msg 104, nivel 15, estado 1, línea 3
Elementos ORDER BY deben aparecer en la lista de selección si la declaración contiene un operador UNION.
¿Cómo utilizo un ORDER BY en una declaración con un UNION ALL?
Copy-Pasteable Ejemplo
CREATE TABLE Friends (Flavor int, Color int)
CREATE TABLE Strangers (Flavor int, StrangerID int)
CREATE TABLE Rainbows (StrangerID int, Color int, Wavelength int)
go
SELECT Flavor, Color
FROM Friends
UNION ALL
SELECT Flavor,
(SELECT TOP 1 Color
FROM Rainbows
WHERE Rainbows.StrangerID = Strangers.StrangerID
ORDER BY Wavelength DESC
) AS Color
FROM Strangers
go
DROP TABLE Rainbows
DROP TABLE Strangers
DROP TABLE Friends
Servidor: Mensaje 104, nivel 15, estado 1, línea 2
Elementos ORDER BY deben aparecer en la lista de selección si la declaración contiene un operador UNION.
Notas al pie
- 1 Contrived ejemplo hipotético. O no.
Ver también
Solución
Un poco de un truco, pero este trabajo.
CREATE TABLE Friends (Flavor int, Color int)
CREATE TABLE Strangers (Flavor int, StrangerID int)
CREATE TABLE Rainbows (StrangerID int, Color int, Wavelength int)
go
SELECT Flavor, Color
FROM Friends
UNION ALL
SELECT Flavor,
(SELECT Color FROM
(SELECT TOP 1 Color, Wavelength
FROM Rainbows
WHERE Rainbows.StrangerID = Strangers.StrangerID
ORDER BY Wavelength DESC
) AS Foo
) AS Color
FROM Strangers
go
DROP TABLE Rainbows
DROP TABLE Strangers
DROP TABLE Friends
Otros consejos
Sé que usted podría utilizar un CTE (expresión de tabla común), donde se puede utilizar para su pedido por el CTE.
;with results as
(
SELECT Cassettes.CassetteNumber,
LastCassetteTransfers.Amount,
CassetteTransfers.CreatedDate
FROM Cassettes
INNER JOIN LastCassetteTransfers
ON Cassettes.CassetteGUID = LastCassetteTransfers.CassetteGUID
UNION ALL
SELECT Cassettes.CassetteNumber,
(
SELECT TOP 1 CassetteTransfers.Amount
FROM CassetteTransfers
WHERE CassetteTransfers.CassetteGUID = Cassettes.CassetteGUID
AND CassetteTransfers.Mode = 'ctmLoad'
) AS Amount,
CassetteTransfers.CreatedDate
FROM Cassettes
)
SELECT CassetNumber, Amount
FROM results
ORDER BY CassetteTransfers.CreatedDate DESC, CassetteTransfers.Amount
Esto debería ayudar. El thig importante es asegurarse de que tiene su orden por columnas devueltos en la consulta interna (en este caso el CTE).
Avísame cómo funciona.
En realidad, mirando a la solución de enlace que os comento, es posible que desee probar esto:
SELECT Flavor, Color
FROM Friends
UNION ALL
SELECT Flavor,
(SELECT TOP 1 Color FROM
(SELECT Color, Wavelength
FROM Rainbows
WHERE Rainbows.StrangerID = Strangers.StrangerID
) X ORDER BY Wavelength DESC) AS Color
FROM Strangers
... o algún tipo similar de cosas para tratar de engañar al motor en no quejarse.
Pero no puedo probarlo, me temo; No creo que tenemos un cuadro de 2000 que queda en el edificio, virtuales o de otra manera.
EDIT: Ah! Se parece a Joe y yo se superponen en nuestra sneakiness:)