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

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top