首页 > 解决方案 > oracle如何在另一个表中加入聚合数据

问题描述

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

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

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

示例:源表中存在名字、姓氏、部分,当发生更新时,审计表中的新值和旧值将被更新。

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

源表:

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

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

标签: oraclejoinoracle11gpivotaggregation

解决方案


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

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 将结果存储在单行中。


推荐阅读