【问题标题】:Mix records of two different tables混合两个不同表的记录
【发布时间】:2011-09-11 00:59:01
【问题描述】:

我正在寻找解决我的 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

【问题讨论】:

    标签: sql join stored-procedures firebird firebird2.5


    【解决方案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;
    

    【讨论】:

    • 如果 varchar 字段的长度不同怎么办?如果字段的编号和类型不同但我需要按日期对记录进行排序怎么办?感谢您的回答!
    • 您的解决方案似乎工作正常,但我无法正确使用“按数据排序”。我可以在哪里放置“order by”声明来为工会工作? (混合排序t1_data和t2_data)
    • 谢谢你的帮助,当你回答我的时候,我发现它正在查看联合语法^^
    • 这个“联合兼容”的东西很糟糕,如果它能够做一个适当的联合,统一命名相同的字段,并使用两个集合中的所有字段名称,那就太好了。我知道这可以通过向每个查询添加额外的字段来完成,但这很痛苦。像大多数 SQL 一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多