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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top