如何在 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;
希望这对您有所帮助。
解释:
首先,我们从SRC_AUD中获取了最新更改的记录。
现在,我们已经将上面的内部视图左连接到SRC table并从SRC_AUD中获取值,如果存在则从原始[=35=中获取值] 即 SRC
注意:SRC_AUD 中的值存储在多行中,因此我们使用分组依据在单行中获取结果。
如本
我有一个来源 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;
希望这对您有所帮助。
解释:
首先,我们从SRC_AUD中获取了最新更改的记录。
现在,我们已经将上面的内部视图左连接到SRC table并从SRC_AUD中获取值,如果存在则从原始[=35=中获取值] 即 SRC
注意:SRC_AUD 中的值存储在多行中,因此我们使用分组依据在单行中获取结果。