Выполнено некоторое тестирование, и результаты довольно странные. Если вы укажете в обеих частях союза в order by
, SQL Server дает ошибку синтаксиса:
select top 2 * from @users where gender = 0 order by id
union all
select top 2 * from @users where gender = 1 order by id
Это имеет смысл, потому что заказ на должен быть только в конце союза. Но если вы используете ту же конструкцию в подзапросе, она компилируется! И работает, как ожидалось:
select * from (
select top 2 * from @users where gender = 0 order by id
union all
select top 2 * from @users where gender = 1 order by id
) sub
Самое странное происходит, когда вы указываете только один order by
для подзапроса союза:
select * from (
select top 2 * from @users where gender = 0
union all
select top 2 * from @users where gender = 1 order by id
) sub
Теперь заказывает первую половину союза в случайном порядке, но вторая половина по id. Это довольно неожиданно. То же самое происходит и с order by
в первой половине:
select * from (
select top 2 * from @users where gender = 0 order by id desc
union all
select top 2 * from @users where gender = 1
) sub
Я ожидаю, что это даст ошибку синтаксиса, но вместо этого он заказывает первую половину союза. Таким образом, похоже, что union
взаимодействует с order by
по-другому, когда union
является частью подзапроса.
Как Chris Дайвер первоначально размещен, хороший способ, чтобы выйти из путаницы не полагаться на order by
в союзе, и указать все явно:
select *
from (
select *
from (
select top 2 *
from @users
where gender = 0
order by
id desc
) males
union all
select *
from (
select top 2 *
from @users
where gender = 1
order by
id desc
) females
) males_and_females
order by
id
Пример данных:
declare @users table (id int identity, name varchar(50), gender bit)
insert into @users (name, gender)
select 'Joe', 0
union all select 'Alex', 0
union all select 'Fred', 0
union all select 'Catherine', 1
union all select 'Diana', 1
union all select 'Esther', 1
Вы можете разместить SQL вашего запроса? В частности, мне интересно о таких вещах, как круглые скобки и местоположение, или в разделе «порядок». – sje397
@ sje397, сделано для ya – eugeneK
По какому критерию вы намерены выбрать первую 1000? В настоящий момент запрос над союзом выбирает эффективно наугад. –