SQL Server: ORDER BY в подзапросе с UNION - PullRequest
11 голосов
/ 10 сентября 2010

У меня есть два запроса в сочетании с 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

Оба из них, конечно, прекрасно работают отдельно, но в сочетании с 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

Запрос не выполнен с ошибкой:

Сообщение 104, Уровень 15, Состояние 1, Строка 3
Элементы ORDER BY должны появляться в списке выбора, если инструкция содержит оператор UNION.

Как использовать ORDER BY в выражении с UNION ALL?

Пример копирования-вставки

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

Сервер: Msg 104, Уровень 15, Состояние 1, Строка 2
Элементы ORDER BY должны появляться в списке выбора, если инструкция содержит оператор UNION.

Сноска

  • 1 Придуманный гипотетический пример. Или нет.

Смотри также

Ответы [ 3 ]

6 голосов
/ 10 сентября 2010

Немного взломать, но это будет работать.

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
1 голос
/ 10 сентября 2010

На самом деле, глядя на обходной путь из той ссылки, которую я прокомментировал, вы можете попробовать это:

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

... или что-то подобное, чтобы попытаться обмануть двигатель, чтобы он не жаловался.

Но я не могу проверить это, я боюсь;Я не думаю, что у нас осталось 2000 ящиков в здании, виртуальном или нет.

РЕДАКТИРОВАТЬ: Ах!Похоже, мы с Джо перекрыли нашу подлость :)

0 голосов
/ 10 сентября 2010

Я знаю, что вы можете использовать CTE (Common Table Expression), где вы можете использовать свой заказ для 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

Это должно помочь.Важно убедиться, что ваш заказ по столбцам возвращен во внутреннем запросе (в данном случае CTE).

Дайте мне знать, как это работает.

...