合并来自Oracle中两个表的数据集

时间:2019-10-21 08:36:14

标签: oracle12c

我在两个表中有以下示例数据:

表1

Item Loc Hierarchy Val1 Val2 Val3 Val4
I1   L1  Item      null null null D1
I2   L2  Item      null null null D2
I2   L3  Item      null null null D3

表2

Item Loc Hierarchy Val1 Val2 Val3 Val4
     L1  ' '       A1   B1   C1   null
     L4  ' '       A4   B4   C4   null

基本上-

  • 层次结构列可以具有'Item'或''值。

  • Item @ Loc的多个组合可以存在。但是只有在“层次结构”为“项目”时才有“项目”条目。 “”层次结构值的“项目”列为空白。

  • Loc可以遵循以下可能的情况-

表1中带有Val1,Val2,Val3为空的一行
在表2中,另一行的Val1,Val2,Val3的值和Val4为null。

在表1中只有一行的Val1,2,3值和Val4为空;表2中没有行。

表2中只有一行的Val4值和Val1,2,3为空;表1中没有带有Val1,2,3值的行。

预期结果-

Item Loc Hierarchy Val1 Val2 Val3 Val4
I1   L1  Item      A1    B1   C1   D1
I2   L2  Item      null null null D2
I2   L3  Item      null null null D3
     L4  ' '       A4   B4   C4   null

如何合并数据并达到期望的结果?通过完全外部联接? 是否有其他可提高性能的替代方法,还是提高完整外部联接查询的一种方法。 由于这是较大查询的子集,因此一旦获得此结果,就必须使用该数据集来更新另一个具有约100M条记录的表(因此需要寻找性能高效的块)。

预先感谢!

1 个答案:

答案 0 :(得分:1)

使用联合查询:

SELECT
    MAX(Item) AS Item,
    Loc,
    CASE WHEN COUNT(CASE WHEN Hierarchy <> ' ' THEN 1 END) > 0
         THEN MAX(CASE WHEN Hierarchy = ' ' THEN NULL ELSE Hierarchy END)
         ELSE MAX(Hierarchy) END AS Hierarchy,
    MAX(Val1) AS Val1,
    MAX(Val2) AS Val2,
    MAX(Val3) AS Val3,
    MAX(Val4) AS Val4
FROM
(
    SELECT Item, Loc, Hierarchy, Val1, Val2, Val3, Val4 FROM Table1
    UNION ALL
    SELECT Item, Loc, Hierarchy, Val1, Val2, Val3, Val4 FROM Table2
) t
GROUP BY
    Loc
ORDER BY
    Loc;