Объединение UNION ALL и ORDER BY в Firebird - PullRequest
13 голосов
/ 10 декабря 2008

Это моя первая попытка ответить на мой собственный вопрос, так как кто-то может столкнуться с этим, и это может помочь. Используя Firebird, я хочу объединить результаты двух запросов с помощью UNION ALL, а затем отсортировать полученный результат по заданному столбцу. Что-то вроде:

(select C1, C2, C3 from T1)
union all 
(select C1, C2, C3 from T2)
order by C3

Скобки взяты из допустимого синтаксиса для других баз данных и необходимы для того, чтобы аргументы UNION ALL (операция, определенная для работы с таблицами, т. Е. неупорядоченный набор записей) не Попробуйте заказать в индивидуальном порядке. Однако я не мог заставить этот синтаксис работать в Firebird - как это сделать?

Ответы [ 6 ]

25 голосов
/ 10 декабря 2008
SELECT C1, C2, C3
FROM (
    select C1, C2, C3 from T1
    union all 
    select C1, C2, C3 from T2
)
order by C3
12 голосов
/ 10 декабря 2008

Имена полей не обязательно должны быть одинаковыми. Вот почему вы не можете использовать имя поля в заказе.
Вместо этого вы можете использовать индекс поля. Как в:

(select C1, C2, C3 from T1)
union all 
(select C7, C8, C9 from T2)
order by 3  
6 голосов
/ 23 июня 2015

Как насчет:

select C1, C2, C3 from T1
union all 
select C1, C2, C3 from T2
order by 2

По крайней мере, в более новых версиях Firebird это работает, если вы заказываете "Number" вместо использования Alias.

2 голосов
/ 03 февраля 2009

В Firebird 1.5 это работает для меня

create view V1 (C1, C2, C3) as
  select C1, C2, C3 from T1
  union all 
  select C1, C2, C3 from T2

, а затем

select C1, C2, C3 from V1 order by C3
1 голос
/ 10 декабря 2008

Выполните UNION ALL в представлении (без предложения ORDER BY), затем выберите из представления, используя ORDER BY.

0 голосов
/ 18 апреля 2017

Перемещение order by в хвост запроса имеет никакого эффекта для вывода сетки данных.

select * from (
    select first 1
        C1
    from T1
    order by id desc
)
union all
select * from (
    select first 1
        C1
    from T2
    order by id desc
)
...