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

Était-ce utile?

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:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top