Объединение 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 - как это можно сделать?

6 ответов

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


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

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


Как насчет:

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

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


В 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


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


Перемещение 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
)

licensed under cc by-sa 3.0 with attribution.