如何在 oracle 中加入另一个 table 中的聚合数据

How to join aggregated data in another table in oracle

如本 中所述,我得到了一些数据 returned。但是我的功能又发生了变化。

我有一个来源 table 和另一个触发的审核 table(当更新来源 table 时,审核 table 将更新一些旧值和新值列)

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

示例:FirstName、LastName、Section 位于源 table 中,当发生更新时,Audit table 将更新新值和旧值。

所以在结果集中,我需要检查特定的 ID 是否存在,如果有任何更改的项目,我必须 return 那些,否则我需要从源 table 获取数据。

源表:

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

我们现在将 bob 部分的源值更改为 "B",将姓氏更改为 Andy

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

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

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

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 table并从SRC_AUD中获取值,如果存在则从原始[=35=中获取值] 即 SRC

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