MS SQL: union + order by

Все, что вы хотели знать о программизме, но боялись спросить.
Аватара пользователя
alpax
Графоман
Сообщения: 10513
Зарегистрирован: 04 мар 2003, 17:39
Откуда: Richmond, BC

MS SQL: union + order by

Сообщение alpax »

Вопрос тут у коллеги возник - меня спрашивает, а я уже SQL подзабыл (да и не знал толком :)).
Хочется из таблички выбрать записи с максимальными значениями поля. Такой select работает нормально:

Код: Выделить всё

select top 5 * from Tbl where Id = 1 order by Num desc
Теперь нужно в результате получить две группы с разными id. В MySQL работал такой union:

Код: Выделить всё

select top 5 * from Tbl where Id = 1 order by Num desc
union all
select top 5 * from Tbl where Id = 2 order by Num desc
В MS SQL на такой запрос выдается ошибка "Incorrect syntax near the keyword 'union'."
Если оставить только последний "order by", запрос работает, но результат получается неправильный - выдаются записи вовсе не с максимальным значением Num.

Как построить запрос, чтобы в MS SQL получить нужный результат?
Аватара пользователя
aldep
Маньяк
Сообщения: 1593
Зарегистрирован: 18 фев 2003, 08:06
Откуда: Toronto
Контактная информация:

Сообщение aldep »

Сделать view а из него сделать select top ... order by
Аватара пользователя
alpax
Графоман
Сообщения: 10513
Зарегистрирован: 04 мар 2003, 17:39
Откуда: Richmond, BC

Сообщение alpax »

aldep писал(а):Сделать view а из него сделать select top ... order by
Ага, должно вроде сработать. Спасибо!
Аватара пользователя
Earl Grey
Маньяк
Сообщения: 2893
Зарегистрирован: 22 фев 2005, 15:07

Re: MS SQL: union + order by

Сообщение Earl Grey »

alpax писал(а):Вопрос тут у коллеги возник - меня спрашивает, а я уже SQL подзабыл (да и не знал толком :)).
Хочется из таблички выбрать записи с максимальными значениями поля. Такой select работает нормально:

Код: Выделить всё

select top 5 * from Tbl where Id = 1 order by Num desc
Теперь нужно в результате получить две группы с разными id. В MySQL работал такой union:

Код: Выделить всё

select top 5 * from Tbl where Id = 1 order by Num desc
union all
select top 5 * from Tbl where Id = 2 order by Num desc
В MS SQL на такой запрос выдается ошибка "Incorrect syntax near the keyword 'union'."
Если оставить только последний "order by", запрос работает, но результат получается неправильный - выдаются записи вовсе не с максимальным значением Num.

Как построить запрос, чтобы в MS SQL получить нужный результат?
а почему

union all, а не просто union?
Аватара пользователя
alpax
Графоман
Сообщения: 10513
Зарегистрирован: 04 мар 2003, 17:39
Откуда: Richmond, BC

Сообщение alpax »

alpax писал(а):Ага, должно вроде сработать.
Хотя стоп! View будет содержать просто union? Тогда "select top" выберет просто верхние, невзирая на значение Id. А надо - ровно 5 "верхних" с одним Id, и 5 с другим.
Или имелся в виду другой view?
Аватара пользователя
alpax
Графоман
Сообщения: 10513
Зарегистрирован: 04 мар 2003, 17:39
Откуда: Richmond, BC

Re: MS SQL: union + order by

Сообщение alpax »

Уникурсал Уникурсалыч писал(а):а почему
union all, а не просто union?
Потому что просто union не работает в нашем случае: "The text data type cannot be selected as DISTINCT because it is not comparable.".
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Re: MS SQL: union + order by

Сообщение папа Карло »

alpax писал(а):
Уникурсал Уникурсалыч писал(а):а почему
union all, а не просто union?
Потому что просто union не работает в нашем случае: "The text data type cannot be selected as DISTINCT because it is not comparable.".
просто от фонаря пишу.....

select * from (<your query with order by) t1
union all
select * from (<your query with order by) t2
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Re: MS SQL: union + order by

Сообщение папа Карло »

Уникурсал Уникурсалыч писал(а):а почему

union all, а не просто union?
с точки зрения производительности использовать надо юнион алл когда ты знаешь что записи в селектах что ты объеденяешь не пересекаются.
Аватара пользователя
alpax
Графоман
Сообщения: 10513
Зарегистрирован: 04 мар 2003, 17:39
Откуда: Richmond, BC

Re: MS SQL: union + order by

Сообщение alpax »

папа Карло писал(а):select * from (<your query with order by) t1
union all
select * from (<your query with order by) t2
О! Похоже, оно... Спасибо!
Yuri Dimant
Пользователь
Сообщения: 107
Зарегистрирован: 02 авг 2004, 22:00

MSSQL

Сообщение Yuri Dimant »

select * from
(
select top 5 * from Tbl where Id = 1
union all
select top 5 * from Tbl where Id = 2
) as der
order by Num desc
Аватара пользователя
aldep
Маньяк
Сообщения: 1593
Зарегистрирован: 18 фев 2003, 08:06
Откуда: Toronto
Контактная информация:

Re: MSSQL

Сообщение aldep »

Yuri Dimant писал(а):select * from
(
select top 5 * from Tbl where Id = 1
union all
select top 5 * from Tbl where Id = 2
) as der
order by Num desc
Пап Карловский работать будет, а этот нет.
Вью, которое я предложил, лучше, если таблицы большие и надо индекс поставить, для производительности.
Аватара пользователя
alpax
Графоман
Сообщения: 10513
Зарегистрирован: 04 мар 2003, 17:39
Откуда: Richmond, BC

Re: MSSQL

Сообщение alpax »

Yuri Dimant писал(а):select * from
(
select top 5 * from Tbl where Id = 1
union all
select top 5 * from Tbl where Id = 2
) as der
order by Num desc
Сервера под рукой нет, чтобы проверить, но по-моему это не сработает - select-ы вернут просто первые попавшиеся 5 записей, а не те, у которых Num - максимальные.
Аватара пользователя
alpax
Графоман
Сообщения: 10513
Зарегистрирован: 04 мар 2003, 17:39
Откуда: Richmond, BC

Re: MSSQL

Сообщение alpax »

aldep писал(а):Вью, которое я предложил, лучше, если таблицы большие и надо индекс поставить, для производительности.
А твой вью разве вернет тот результат, который нужен? Я вон там выше спрашивал.
Аватара пользователя
aldep
Маньяк
Сообщения: 1593
Зарегистрирован: 18 фев 2003, 08:06
Откуда: Toronto
Контактная информация:

Сообщение aldep »

Пропустил это пояснение, тады, да не вернет.
Но не проще тогда сделать два запроса?
hawk
Пользователь
Сообщения: 141
Зарегистрирован: 21 мар 2005, 20:08
Откуда: St. Petersburg->Vancouver

Сообщение hawk »

А нафига nested queries воротить?

просто выкинуть первый order by, как нарушающий ANSI стандарт.
т.е.
select id from test where id=1
union all
select id from test where id=2
order by id;

разве не сработает?

PS. опс... слона в виде "select top" я и не приметил. :(
Ответить