SQL Server: порядок в подзапросе с UNION
у меня есть два запроса объединяются с 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
запрос завершается с ошибкой:
Msg 104, Уровень 15, Состояние 1, Строка 3
Если инструкция содержит оператор UNION, в списке select должны появиться элементы ORDER BY.
как использовать заказ по в заявлении с профсоюзом все?
Copy-Pasteable Example
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
Если инструкция содержит оператор UNION, в списке select должны появиться элементы ORDER BY.
сноски
- 1надуманный, гипотетический пример. Или нет.
см. также
3 ответов
немного взломать, но это будет работать.
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
на самом деле, глядя на обходной путь из этой ссылки, которую я прокомментировал, вы можете попробовать следующее:
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
...или что-то подобное, чтобы попытаться обмануть двигатель, чтобы не жаловаться.
EDIT: Ah! Похоже, мы с Джо наложились на нашу подлость:)
Я знаю , что вы можете использовать CTE (общее табличное выражение), где вы можете использовать свой заказ для 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).
Дайте мне знать, как это работает.