2008-12-09 105 views
13

这是我第一次回答我自己的问题,因为有人可能会遇到这个问题,所以它可能会有所帮助。使用Firebird,我想使用UNION ALL组合两个查询的结果,然后在给定列上对结果输出进行排序。喜欢的东西:在Firebird中结合了UNION ALL和ORDER BY

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

括号从其他数据库有效的语法来了,并且需要确保的参数UNION ALL(这是定义在表上工作的操作 - 即一个无序的记录集)不要试图单独订购。然而,我无法在Firebird中使用这种语法 - 它如何完成?

回答

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

谢谢你这么多的工作......我无法工作,如何让内条款没有中间视图。 – Chris 2008-12-09 21:18:25

+0

请注意,此查询需要Firebird 2.x或更高版本 – alldayremix 2016-06-15 16:03:58

1

在视图中执行UNION ALL(不带ORDER BY子句),然后使用ORDER BY从视图中选择。

+0

+1“向后”兼容,其他的答案不火鸟1.5 – 2009-07-17 18:34:51

12

字段名不必相同。这就是为什么你不能按顺序使用字段名称的原因。
您可以改用字段索引。如:

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

正如所写,这需要Firebird 2.x,但如果您删除括号,这也将工作在Firebird 1.5 – alldayremix 2016-06-15 16:02:53

2

在火鸟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 
+0

+1“向后”兼容性,其他答案不会在Firebird 1.5中工作 – 2009-07-17 18:35:07

4

如何:

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

至少在新火鸟版本它可以工作,如果您通过“数量”而不是使用订单一个别名。

0

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 
)