SQL Server: ORDER BY in subquery con UNION
-
02-10-2019 - |
Domanda
ho due query viene combinato 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
Entrambi i quali, ovviamente, funzionano bene separatamente, ma quando combinato 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 query ha esito negativo con l'errore:
Msg 104, livello 15, stato 1, riga 3
ORDER BY articoli deve apparire nell'elenco di selezione se l'istruzione contiene un operatore UNION.
Come faccio a utilizzare un ORDER BY in una dichiarazione con un UNION ALL?
Copy-Pasteable Esempio
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
Server: Messaggio 104, livello 15, stato 1, riga 2
ORDER BY articoli deve apparire nell'elenco di selezione se l'istruzione contiene un operatore UNION.
Note
- 1 Escogitato esempio ipotetico. O non.
Vedi anche
Soluzione
Un po 'di un hack, ma questo lavoro volontà.
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
Altri suggerimenti
Lo so che si potrebbe usare un CTE (Tabella espressione comune), dove è possibile utilizzare il vostro ordine da per il 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
Questo dovrebbe aiutare. Il thig importante è assicurarsi di avere l'ordine da colonne restituiti nella query interna (in questo caso il CTE).
Fammi sapere come funziona.
In realtà, guardando la soluzione da quel collegamento ho commentato, si potrebbe desiderare di provare questo:
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 qualche simile tipo di cosa per cercare di ingannare il motore nel non lamentarsi.
Ma non posso provarlo, ho paura; Non credo che abbiamo una scatola di 2000 sinistra nella costruzione, virtuale o in altro modo.
EDIT: Ah! Looks come Joe ed io sovrapposti sul nostro sneakiness:)