Как объединить агрегированные данные в другую таблицу в Oracle - PullRequest
0 голосов
/ 04 июня 2019

Как уже упоминалось в этом вопросе Я вернул некоторые данные.Но опять-таки произошли изменения в моей функциональности.

У меня есть исходная таблица и другая инициированная таблица аудита (при обновлении исходной таблицы таблица аудита будет обновлена ​​со старыми и новыми значениями для некоторых столбцов)

Итак, запрос здесь, мне нужно взять данные из исходной таблицы, и когда в таблице аудита доступно изменение для этого конкретного столбца, мне нужно принять это значение.

Пример: FirstName, LastName,В исходной таблице есть раздел, и когда происходит обновление, в таблице аудита будут обновлены новое значение и старое значение.

Так что в наборе результатов мне нужно проверить, есть ли конкретный идентификатор и есть лилюбые измененные элементы, которые я должен вернуть, или же мне нужно взять данные из исходной таблицы.

SourceTable:

ID FirstName LastName Section   Address
1  BOB        A         A       Mississippi
2  ROY        B         B       Edinburgh

Теперь мы изменим исходное значение для раздела bob на «B» иФамилия Энди

ID   Link_ID   ChangedColumn OldValue NewValue
1    1         LastName       A       Andy
2    1         Section        B       C

теперь мне нужно взять набор результатов этого, проверив, есть ли какое-либо измененное значение, а затем принять это оr еще взять из исходной таблицы только значение

1 Ответ

1 голос
/ 04 июня 2019

Вы можете использовать следующий запрос для выполнения вашего требования:

SELECT
    SRC.ID,
    MAX(CASE
        WHEN SRC_AUD.CHANGEDCOLUMN = 'FirstName' THEN SRC_AUD.NEWVALUE
        ELSE SRC.FIRSTNAME
    END) AS FIRSTNAME,
    MAX(CASE
        WHEN SRC_AUD.CHANGEDCOLUMN = 'LastName' THEN SRC_AUD.NEWVALUE
        ELSE SRC.LASTNAME
    END) AS LASTNAME,
    MAX(CASE
        WHEN SRC_AUD.CHANGEDCOLUMN = 'Section' THEN SRC_AUD.NEWVALUE
        ELSE SRC.SECTION
    END) AS SECTION,
    MAX(SRC.ADDRESS) AS ADDRESS
FROM
    SRC
    LEFT OUTER JOIN (
        SELECT
            ID,
            LINKID,
            CHANGEDCOLUMN,
            OLDVALUE,
            NEWVALUE
        FROM
            (
                SELECT
                    ID,
                    LINKID,
                    CHANGEDCOLUMN,
                    OLDVALUE,
                    NEWVALUE,
                    ROW_NUMBER() OVER(
                        PARTITION BY LINKID, CHANGEDCOLUMN
                        ORDER BY
                            ID DESC NULLS LAST
                    ) AS RN
                FROM
                    SRC_AUD
            )
        WHERE
            RN = 1
    ) SRC_AUD ON SRC.ID = SRC_AUD.LINKID
GROUP BY
    SRC.ID
order by SRC.ID;

Надеюсь, это полезно.

Демо

Пояснение:

  1. Сначала мы взяли последние измененные записи из SRC_AUD.

  2. Теперь мы оставили присоединенное выше внутреннее представление к таблице SRC и взяли значение из SRC_AUD, если существует, иначе взяли значение из исходной таблицы, т.е. SRC

Примечание: значения в SRC_AUD хранились в нескольких строках, поэтому мы использовали group by для получения результата в одной строке.

...