Объединить набор данных из двух таблиц в Oracle - PullRequest
1 голос
/ 21 октября 2019

У меня есть приведенные ниже примеры данных в двух таблицах:

Таблица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 @ Loc. Но будет иметь элемент Item, только если Иерархия - это Item;Столбец элемента будет пустым для значения '' иерархии.

  • Loc может следовать следующим возможным сценариям -

Одна строка с Val1, Val2, Val3 какнуль в таблице 1
и еще одна строка с Val1, Val2, Val3 со значениями и Val4 как ноль в таблице 2.

Только одна строка со значениями Val1,2,3 и Val4 как ноль в Table1;в Таблице 2 нет строки.

Только одна строка со значением Val4 и Val1,2,3 в Таблице 2 как ноль;нет строки со значениями Val1,2,3 в таблице 1.

Ожидаемый результат-

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

Как можно объединить данные и достичь желаемого результата? Полное внешнее соединение? Существуют ли другие альтернативные методы, которые являются эффективными с точки зрения производительности, ИЛИ способ повышения полного запроса на внешнее соединение. Поскольку это подмножество более крупного запроса, поэтому, как только я достигну этого результата, я должен использовать этот набор данных для обновления другой таблицы, содержащей около 100 миллионов записей (следовательно, для поиска блоков, эффективных по производительности).

Спасибо заранее!

1 Ответ

1 голос
/ 21 октября 2019

Используйте запрос объединения:

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;
...