Вопрос

Это моя первая попытка ответить на свой собственный вопрос, поскольку кто-то вполне может столкнуться с этим, и это может оказаться полезным.Используя 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
)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top