Combining UNION ALL and ORDER BY in Firebird

2019-01-18 22:32发布

This is my first attempt at answering my own question, since someone may well run into this and so it might be of help. Using Firebird, I want to combine the results of two queries using UNION ALL, then sort the resulting output on a given column. Something like:

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

The parentheses came from valid syntax for other databases, and are needed to make sure the arguments to UNION ALL (an operation that's defined to work on tables - i.e. an unordered set of records) don't try to be ordered individually. However I couldn't get this syntax to work in Firebird - how can it be done?

6条回答
孤傲高冷的网名
2楼-- · 2019-01-18 22:48
SELECT C1, C2, C3
FROM (
    select C1, C2, C3 from T1
    union all 
    select C1, C2, C3 from T2
)
order by C3
查看更多
孤傲高冷的网名
3楼-- · 2019-01-18 22:49

Field names are not required to be equal. That's why you can't use the field name in the order by.
You may use the field index instead. As in:

(select C1, C2, C3 from T1)
union all 
(select C7, C8, C9 from T2)
order by 3  
查看更多
▲ chillily
4楼-- · 2019-01-18 22:49

Moving order by into a query tail has no effect to output 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
)
查看更多
女痞
5楼-- · 2019-01-18 22:52

Perform the UNION ALL in a view (without the ORDER BY clause), then select from the view using ORDER BY.

查看更多
萌系小妹纸
6楼-- · 2019-01-18 23:00

In Firebird 1.5 this works for me

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

and then

select C1, C2, C3 from V1 order by C3
查看更多
做个烂人
7楼-- · 2019-01-18 23:14

How about:

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

At least in the newer Firebird Versions it works if you order by "Number" instead of using an Alias.

查看更多
登录 后发表回答