SQL Server запрос с объединением и различным порядком для каждого раздела? - PullRequest
1 голос
/ 10 декабря 2011

Я искал здесь на сайте.и есть много вариантов ответов на этот вопрос.Но не смог найти то, что я искал для этого конкретного вопроса:

Допустим, что xxx, yyy, zzz имеет 1 столбец, 3 строки:

1   
2   
3   

SELECT a FROM xxx  order by a asc
UNION 
SELECT f FROM yyy order by f desc
UNION 
SELECT t FROM zzz order by t asc

Итак, желаемый набор результатовis:

1
2
3
3
2
1
1
2
3

В UNION имеется ошибка неправильного синтаксиса.

Мне известна проблема порядка с объединением (и я знаю, как ее решить, только если общий ORDER BYтребуется.)

Вопрос:

как получить желаемый результат?

Ответы [ 2 ]

5 голосов
/ 10 декабря 2011

Вы должны применить одиночный заказ по предложению к целому объединению, иначе порядок не будет четко определен:

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
0 голосов
/ 10 декабря 2011

Что нужно иметь в виду, пока UNIONing:

  • UNION позволяет создать RESULTSET с однотипными данными из другого оператора SELECT.
  • RESULTSET генерируется с именем столбца ведущего (первого) SELECT оператора.
  • Для других SELECT столбцов операторов тип данных должен соответствовать в соответствии с первым (первым) SELECT оператором.
  • Для ORDERing он применяется к RESULTSET, следовательно, в случае UNION он допускает ORDER BY только в последнем операторе SELECT, но принимает имя столбца в соответствии с первым (первым) SELECT утверждение, поэтому приведенный ниже пример верен:
  • Наконец , поскольку в RESULTSET для UNIONing с различными таблицами / источниками агрегирует все данные в столбец (согласно первому (начальному) SELECT утверждению), поэтому вы не можете применить ASC и DESC для того же столбца.

правый

SELECT a FROM xxx 
UNION 
SELECT f FROM yyy
UNION 
SELECT t FROM zzz order by a asc

Неправильно : по вашему мнению

SELECT a FROM xxx 
UNION 
SELECT f FROM yyy
UNION 
SELECT t FROM zzz order by a asc, a desc
...