【问题标题】:Combine Multiple Column values into one Row将多个列值合并为一行
【发布时间】:2019-04-18 16:15:35
【问题描述】:

我有如下数据,我想将具有空值的行与非空值组合在一起。

ID    ColA    ColB      ColC     ColD
1     A1      B1        null     null
1     A2      B2        null     null
1     null    B3        C1       D1
2     A3      B3        null     null
3     null    null      C3       D3

预期结果:

ID  ColA   ColB    ColC     ColD
1   A1      B1     C1       D1
1   A2      B2     C1       D1
2   A3      B3     null     null
3   null    null   C3       D3

对于单个 ID,基本上可以存在多行(不同的 COLA),但只有一行具有 null ColA。

ColC 和 ColD 对于 ColA 不为空的行将始终为空。

我想将 ColA 为空的行的 ColB、ColC 和 ColD 值与 ColA 不为空的所有行合并。

【问题讨论】:

  • 对于特定的 ID,总有一行 ColA IS NULL 或者该行可能存在也可能不存在?
  • 可能的情况: 1. 只有空 ColA 的行。 2. 只有非空 ColA 的行。 3. ColA为空的行和ColA不为空的多行
  • 然后使用 LEFT OUTER JOIN(见我的回答)。如果 ColA IS NOT NULL 的行可能不存在,请使用 FULL JOIN。

标签: oracle


【解决方案1】:

一种方法是使用两个相关的子查询:

SELECT ID,ColA,ColB,
       (SELECT ColC FROM table y 
        WHERE x.id = y.id AND ColA IS NULL) As ColC,
       (SELECT ColD FROM table y 
        WHERE x.id = y.id AND ColA IS NULL) As ColD
FROM table x
WHERE ColA IS NOT NULL

另一种方法是使用自联接

SELECT x.ID,x.ColA,x.ColB,
       y.ColC,y.ColD
FROM table x
JOIN table y
ON x.ID = y.ID AND x.ColA IS NOT NULL AND y.ColA IS NULL

编辑


如果对于特定 ID,只有一行 ColA 值不为空

我猜你的意思是对于特定的 id,根本没有 ColA = NULL 的行。
在这种情况下,第一个查询将起作用,第二个查询必须使用 LEFT JOIN:

SELECT x.ID,x.ColA,x.ColB,
       y.ColC,y.ColD
FROM table x
LEFT JOIN table y
ON x.ID = y.ID AND x.ColA IS NOT NULL AND y.ColA IS NULL

或只有 null ColA 的行

在这种情况下,必须使用 NOT EXISTS 子查询扩展条件:

SELECT ID,ColA,ColB,
       (SELECT ColC FROM table y 
        WHERE x.id = y.id AND ColA IS NULL) As ColC,
       (SELECT ColD FROM table y 
        WHERE x.id = y.id AND ColA IS NULL) As ColD
FROM table x
WHERE ColA IS NOT NULL
  OR NOT EXISTS (
     SELECT 1 FROM table z
     WHERE  x.id = z.id AND z.ColA IS NOT NULL
  )

SELECT x.ID,x.ColA,x.ColB,
       y.ColC,y.ColD
FROM table x
LEFT JOIN table y
ON x.ID = y.ID AND y.ColA IS NULL
WHERE x.ColA IS NOT NULL 
   OR NOT EXISTS (
         SELECT 1 FROM table z
         WHERE  x.id = z.id AND z.ColA IS NOT NULL
      )

【讨论】:

  • 我还有一个问题。如果对于特定 ID,只有一行 ColA 值不为空(或一行只有空 ColA),那么如何在结果集中也返回该行。 . 自连接将导致对应的行有空 ColA 存在的行,rt?
  • @sqlpractice 我已将答案扩展到其他案例
  • @krokodilko我已经编辑了数据集和预期的结果。您能否为更新的预期结果提供解决方案。还有有没有办法避免 Not exists 子查询?
【解决方案2】:

你可以试试这个:

SELECT filled.ID,
       filled.ColA,
       filled.ColB AS ColB_1,
       empty.ColB  AS ColB_2,
       empty.ColC,
       empty.ColD
FROM   my_table filled
JOIN   my_table empty
  ON   filled.ID = empty.ID
 AND   empty.ColA IS NULL
WHERE  filled.ColA IS NOT NULL;

使用LEFT OUTER JOIN 以防ColA IS NULL 所在的行可能不存在。

【讨论】:

    猜你喜欢
    • 2014-06-19
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2016-01-10
    相关资源
    最近更新 更多