【问题标题】:How can I merge the columns from two tables into one output?如何将两个表中的列合并到一个输出中?
【发布时间】:2011-01-22 13:20:27
【问题描述】:

我有两张信息相似的表格。我们称他们为items_aitems_b。它们应该是一个,但它们来自不同的来源,所以它们不是。当我完全加入这两个表时,一些行最终会包含来自一个表或两个表的数据。两个表中的一列是category_id。我想使用category_id 将组合表与类别表交叉。但是,我现在有两个category_id 列(一个来自items_a,一个来自items_b)。有没有办法将两列合并为一列?

我希望这不是一个太令人困惑的问题。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    在查询中指定列应该可以解决问题:

    select a.col1, b.col2, a.col3, b.col4, a.category_id 
    from items_a a, items_b b 
    where a.category_id = b.category_id
    

    应该在选择你想要的列方面做到这一点。

    要解决某些数据仅在 items_a 中而某些数据仅在 items_b 中的事实,您可以这样做:

    select 
      coalesce(a.col1, b.col1) as col1, 
      coalesce(a.col2, b.col2) as col2,
      coalesce(a.col3, b.col3) as col3,
      a.category_id
    from items_a a, items_b b
    where a.category_id = b.category_id
    

    coalesce 函数将返回第一个非 null 值,因此对于每一行,如果 col1 为非 null,它将使用该值,否则它将从 col2 等获取值。

    【讨论】:

    • 我也可以在以下地方使用它吗:... where c.col1 = coalesce(a.col1, b.col1) ?
    • @bigmac: 应该不是问题
    • 如果没有共同的 id 怎么办?我只想让列彼此连接,没有共同的 id,只是它们出现的顺序?
    • @CMCDragonkai:这听起来像是一个不同的问题。如果没有什么要加入两个表,那么依靠自然顺序并不能保证给你一致的结果。
    • 如果我想检查列a.col1 和列b.col1 的值,看看值是否不同?如果 a.col1 为 0 且 b.col1 为 1,则删除该行。如果其中之一为空,则使用非空值。如果两者都为 null,则保留 null 值。
    【解决方案2】:

    我猜你想要做的是both tables 中的UNION

    如果两个表有相同的列,那么你可以这样做

    SELECT category_id, col1, col2, col3
      FROM items_a
    UNION 
    SELECT category_id, col1, col2, col3 
      FROM items_b
    

    否则,您可能必须执行类似的操作

    SELECT category_id, col1, col2, col3
      FROM items_a 
    UNION 
    SELECT category_id, col_1 as col1, col_2 as col2, col_3 as col3
      FROM items_b
    

    【讨论】:

    • 您的第一个示例不是有效的 UNION 语句 - 它实际上应该是两个 SELECT 语句的组合。第二个示例不需要括号,否则在语法上是正确的。
    【解决方案3】:

    我遇到了类似的问题,但有一点不同:有些 a.category_id 不在 b 中,有些 b.category_id 不在 a。
    要解决这个问题,只需将 beny23 的优秀答案改编为

    选择 a.col1、b.col2、a.col3、b.col4、a.category_id 来自 items_a 左外连接 items_b b 在 a.category_id = b.category_id

    希望这对某人有所帮助。
    问候。

    【讨论】:

      【解决方案4】:
      SELECT col1,
        col2
      FROM
        (SELECT rownum X,col_table1 FROM table1) T1
      INNER JOIN
        (SELECT rownum Y, col_table2 FROM table2) T2
      ON T1.X=T2.Y;
      

      【讨论】:

      • 很难将其解读为原始问题的答案。虽然这个概念可能确实是正确的,但它需要一些解释来说明它与问题的关系。
      • 这个答案确实帮助我将两个不同表中的两列组合起来,并将它们显示为单个查询中的两个不同列。
      【解决方案5】:

      当你是三个或更多表时,只需添加联合和左外连接:

      select a.col1, b.col2, a.col3, b.col4, a.category_id 
      from 
      (
          select category_id from a
          union
          select category_id from b
      ) as c
      left outer join a on a.category_id = c.category_id
      left outer join b on b.category_id = c.category_id
      

      【讨论】:

        【解决方案6】:

        最佳答案假定两个结果都不为空。在我的要求中,我有两个表需要制作为 1 且没有连接约束。我只是将它们组合起来。

        如果你想得到结果不管1是否为null。

        select a.col1, b.col2, a.col3, b.col4, a.category_id 
        from items_a a
          full outer join items_b b 
          on 1=1
         
        

        应该做的伎俩。 当我实际上这样做时,我不得不走得更远,为我想要连接在一起的两个“集合”使用表格表达式,然后完全外部连接这两个集合。

        【讨论】:

          【解决方案7】:

          选择 a.categoryname、b.productname、a.categoryid 从类别 a 左外连接 产品b a.categoryid = b.categoryid ;

          【讨论】:

            【解决方案8】:
            select COALESCE(A.CUR_ID, B.CUR_ID, 'OTHER') as CUR_ID 
            from (select 'CHF'as CUR_ID) as A 
            full outer join (select 'UAD' as CUR_ID) as B
            on A.CUR_ID = B.CUR_ID
            

            输出:

            CUR_ID
            CHF
            UAD
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-11-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-09-22
              • 1970-01-01
              • 2021-11-09
              相关资源
              最近更新 更多