SQL Server: ORDER BY dans la sous-requête avec UNION
-
02-10-2019 - |
Question
i ai deux requêtes étant combiné avec 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
Les deux qui, bien sûr, le travail bien séparément, mais lorsqu'il est combiné avec 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 requête échoue avec l'erreur:
Msg 104, niveau 15, état 1, ligne 3
ORDER BY articles doit apparaître dans la liste de sélection si l'instruction contient un opérateur UNION.
Comment puis-je utiliser une clause ORDER BY dans une déclaration avec un UNION ALL?
Copier-Pasteable Exemple
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
Serveur: Msg 104, niveau 15, état 1, ligne 2
ORDER BY articles doit apparaître dans la liste de sélection si l'instruction contient un opérateur UNION.
Notes
- 1 Contrived exemple hypothétique. Ou pas.
Voir aussi
La solution
Un peu d'un hack, mais ce travail de 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
Autres conseils
Je sais que vous pouvez utiliser un CTE (Common Table Expression), où vous pouvez utiliser votre commande par le 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
Cela devrait aider. Le thig important est de vous assurer que vous avez votre commande par des colonnes renvoyées dans la requête interne (dans ce cas, le CTE).
Permettez-moi de savoir comment cela fonctionne.
En fait, en regardant la solution de contournement de ce lien que je commentais, vous voudrez peut-être essayer ceci:
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
... ou un certain type de chose semblable à essayer de tromper le moteur en ne se plaint pas.
Mais je ne peux pas tester, j'ai peur; Je ne pense pas que nous avons une boîte 2000 gauche dans le bâtiment, virtuel ou autrement.
EDIT: Ah! On dirait que Joe et moi chevauchaient sur notre sournoiserie:)