Вы должны применить одиночный заказ по предложению к целому объединению, иначе порядок не будет четко определен:
SELECT a,1 as Pos,a as Ord from xxx
UNION ALL
SELECT f,2,-f from yyy
UNION ALL
SELECT t,3,t from zzz
ORDER BY Pos,Ord
Однако,-f
может показаться грязным трюком для достижения противоположного порядка (или может быть не совсем тем, что вы хотите, если включено NULL
с), поэтому вы также можете сделать:
SELECT a,1 as Pos,a as OrdAsc,0 as OrdDesc from xxx
UNION ALL
SELECT f,2,0,f from yyy
UNION ALL
SELECT t,3,t,0 from zzz
ORDER BY Pos asc,Ord asc,OrdDesc desc
Мне неясно, почему вы не думаете, что он отвечает на ваш вопрос - возможно, из-за дополнительных столбцов в наборе результатов?Если это так, вы можете организовать целое UNION
в подзапросе:
create table #xxx (a int not null)
create table #yyy (f int not null)
create table #zzz (t int not null)
insert into #xxx (a) select 1 union all select 2 union all select 3
insert into #yyy (f) select 1 union all select 2 union all select 3
insert into #zzz (t) select 1 union all select 2 union all select 3
SELECT a FROM (
SELECT a,1 as Pos,a as Ord from #xxx
UNION ALL
SELECT f,2,-f from #yyy
UNION ALL
SELECT t,3,t from #zzz
) t
ORDER BY Pos,Ord
результаты:
a
----
1
2
3
3
2
1
1
2
3