Объединение UNION ALL и ORDER BY в Firebird
-
21-08-2019 - |
Вопрос
Это моя первая попытка ответить на свой собственный вопрос, поскольку кто-то вполне может столкнуться с этим, и это может оказаться полезным.Используя Firebird, я хочу объединить результаты двух запросов, используя UNION ALL, затем отсортировать результирующий результат по заданному столбцу.Что - то вроде:
(select C1, C2, C3 from T1)
union all
(select C1, C2, C3 from T2)
order by C3
Круглые скобки взяты из допустимого синтаксиса для других баз данных и необходимы, чтобы убедиться, что аргументы ОБЪЕДИНЯЮТ ВСЕ (операция, которая определена для работы с таблицами, т. е.ан неупорядоченный набор рекордов) не пытайтесь заказывать по отдельности.Однако я не смог заставить этот синтаксис работать в Firebird - как это можно сделать?
Решение
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
Выполните ОБЪЕДИНЕНИЕ ВСЕХ в представлении (без предложения ORDER BY), затем выберите в представлении, используя ORDER BY.
Движущийся 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
)