Firebird - 混合两个不同表的记录

时间:2011-09-11 00:59:01

标签: sql stored-procedures join firebird2.5

我正在寻找解决我的SQL问题的方法。

我在Firebird 2.5中有两个表(T1和T2),如下所示:

T1 (
 T1_ID INTEGER,
 T1_DAY DATE,
 T1_NAME VARCHAR(200)
)

T2 (
 T2_ID INTEGER,
 T2_DAY DATE,
 T2_NAME VARCHAR(200)
)

我需要一个混合这些表的记录并按asc日期顺序对它们进行排序的查询。我不在乎连接查询是否增加了字段数,或者日期字段与结果或存储过程不相同。

输出,例如

T1_ID   T1_DAY   T1_NAME T2_ID   T2_DAY   T2_NAME
---------------------------------------------------
  1   01/02/2011  BOB     NULL    NULL     NULL
  2   27/02/2011  SAM     NULL    NULL     NULL
 NULL    NULL     NULL     8   15/03/2011  PETER
 NULL    NULL     NULL     10  21/03/2011  JOHN
  6   17/04/2011  AMY     NULL    NULL     NULL

或(更好的输出)

 ID       DAY     NAME
-------------------------
  1   01/02/2011  BOB
  2   27/02/2011  SAM
  8   15/03/2011  PETER
  10  21/03/2011  JOHN
  6   17/04/2011  AMY

作为我在stackoverflow.com上的第一篇文章(即使我过去跟着它),我想感谢你对我的问题的任何回复,并感谢大家创造和帮助这个美丽的社区!

祝你好运

弗朗西斯

1 个答案:

答案 0 :(得分:1)

您需要UNION运算符:

SELECT
   T1.T1_ID ID,
   T1.T1_DAY DAY,
   T1.T1_NAME NAME
FROM
   T1

UNION
SELECT
    T2.T2_ID,
    T2.T2_DAY
    T2.T2_NAME
FROM
    T2
;

您可以让个人选择具有您喜欢的任何其他功能。唯一的限制是两个选择列表中的所有列都具有相同的顺序并且具有相同的类型(它们是“联合兼容”)。生成的行将具有类似第一个选择的列标题。

编辑:要控制联合的排序,您必须在子选择中执行联合,并在外部查询中进行排序。

SELECT u.ID, u.DAY, u.NAME
FROM (
    SELECT T1.T1_ID ID, T1.T1_DAY DAY, T1.T1_NAME NAME
    FROM T1

    UNION
    SELECT T2.T2_ID, T2.T2_DAY T2.T2_NAME
    FROM T2
) u
ORDER BY u.NAME;