0

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

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

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

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

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

示例输出

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
4

1 回答 1

2

您希望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;
于 2011-09-11T01:04:48.917 回答