【问题标题】:How to join aggregated data in another table in oracleoracle如何在另一个表中加入聚合数据
【发布时间】:2019-10-20 02:06:12
【问题描述】:

正如question 中提到的,我返回了一些数据。但是我的功能再次发生了变化。

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

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

示例:源表中存在 FirstName、LastName、Section,当发生更新时,审核表中的新值和旧值将被更新。

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

源表:

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

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

【问题讨论】:

    标签: oracle join oracle11g pivot aggregation


    【解决方案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 将结果存储在单行中。

    【讨论】:

    • 这很好,我现在有了一些想法。非常感谢。
    • 说明会更好,请提供。
    猜你喜欢
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 2021-12-20
    • 1970-01-01
    • 2021-05-08
    • 2021-02-12
    相关资源
    最近更新 更多