Объединение UNION ALL и ORDER BY в Firebird

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

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

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

Ответы

Ответ 1

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

Ответ 2

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

(select C1, C2, C3 from T1)
union all 
(select C7, C8, C9 from T2)
order by 3  

Ответ 3

Как насчет:

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

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

Ответ 4

В 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

Ответ 5

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

Ответ 6

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

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
)