如何在Oracle

时间:2019-06-04 14:08:25

标签: oracle join oracle11g pivot aggregation

如本question中所述,我得到了一些数据。但同样,我的功能有所改变。

我有一个源表和另一个触发的审计表(更新源表时,审计表将使用某些列的新旧值进行更新)

所以这里的查询是,我需要从源表中获取数据,并且当审计​​表中针对该特定列的可用更改时,我需要获取该值。

示例:名字,姓氏,源表中存在节,并且当发生更新时,在审计表中将更新新值和旧值。

因此,在结果集中,我需要检查特定的ID是否存在,如果有任何更改的项目,我必须将其返回,否则我需要从源表中获取数据。

SourceTable:

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

我们现在将bob Section的源值更改为“ B”,将Lastname更改为Andy

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

现在我需要通过检查是否存在任何已更改的值来获取此结果集,然后仅从源表中获取该值

1 个答案:

答案 0 :(得分:1)

您可以使用以下查询满足您的要求:

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;

希望这会有所帮助。

Demo

说明:

  1. 首先,我们从SRC_AUD获取了最新更改的记录。

  2. 现在,我们将上面的内部视图连接到SRC表,并从SRC_AUD中获取值,如果还存在,则从原始表中获取值,即SRC

注意:SRC_AUD中的值存储在多行中,因此我们使用group by在单行中获取结果。