如本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
现在我需要通过检查是否存在任何已更改的值来获取此结果集,然后仅从源表中获取该值
答案 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;
希望这会有所帮助。
说明:
首先,我们从SRC_AUD获取了最新更改的记录。
现在,我们将上面的内部视图连接到SRC表,并从SRC_AUD中获取值,如果还存在,则从原始表中获取值,即SRC
注意:SRC_AUD中的值存储在多行中,因此我们使用group by在单行中获取结果。