Страница 1 из 2
MS SQL: union + order by
Добавлено: 06 дек 2006, 11:21
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 получить нужный результат?
Добавлено: 06 дек 2006, 12:24
aldep
Сделать view а из него сделать select top ... order by
Добавлено: 06 дек 2006, 12:59
alpax
aldep писал(а):Сделать view а из него сделать select top ... order by
Ага, должно вроде сработать. Спасибо!
Re: MS SQL: union + order by
Добавлено: 06 дек 2006, 13:02
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?
Добавлено: 06 дек 2006, 13:02
alpax
alpax писал(а):Ага, должно вроде сработать.
Хотя стоп! View будет содержать просто union? Тогда "select top" выберет просто верхние, невзирая на значение Id. А надо - ровно 5 "верхних" с одним Id, и 5 с другим.
Или имелся в виду другой view?
Re: MS SQL: union + order by
Добавлено: 06 дек 2006, 13:04
alpax
Уникурсал Уникурсалыч писал(а):а почему
union all, а не просто union?
Потому что просто union не работает в нашем случае: "The text data type cannot be selected as DISTINCT because it is not comparable.".
Re: MS SQL: union + order by
Добавлено: 06 дек 2006, 13:11
папа Карло
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
Re: MS SQL: union + order by
Добавлено: 06 дек 2006, 13:22
папа Карло
Уникурсал Уникурсалыч писал(а):а почему
union all, а не просто union?
с точки зрения производительности использовать надо юнион алл когда ты знаешь что записи в селектах что ты объеденяешь не пересекаются.
Re: MS SQL: union + order by
Добавлено: 06 дек 2006, 14:30
alpax
папа Карло писал(а):select * from (<your query with order by) t1
union all
select * from (<your query with order by) t2
О! Похоже, оно... Спасибо!
MSSQL
Добавлено: 06 дек 2006, 21:09
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
Re: MSSQL
Добавлено: 06 дек 2006, 21:30
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
Пап Карловский работать будет, а этот нет.
Вью, которое я предложил, лучше, если таблицы большие и надо индекс поставить, для производительности.
Re: MSSQL
Добавлено: 06 дек 2006, 21:30
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 - максимальные.
Re: MSSQL
Добавлено: 06 дек 2006, 21:32
alpax
aldep писал(а):Вью, которое я предложил, лучше, если таблицы большие и надо индекс поставить, для производительности.
А твой вью разве вернет тот результат, который нужен? Я вон там выше спрашивал.
Добавлено: 06 дек 2006, 21:39
aldep
Пропустил это пояснение, тады, да не вернет.
Но не проще тогда сделать два запроса?
Добавлено: 06 дек 2006, 21:40
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" я и не приметил.
