【发布时间】:2020-04-16 07:35:57
【问题描述】:
我有这样的表 MY_TABLE,它存储来自许多表的更改数据(更新跟踪)。因此,每当其他表有一些更新时,我都会在基表上使用AFTER UPDATE TRIGGER 将新数据存储在 MY_TABLE 中。
ID RECORD_DESC EMP_ID FIRST_NAME LAST_NAME GENDER SALARY
1 EMP 5 ABC XYZ
2 EMP 5 M
3 EMP 5 XYZ-NEW F
4 SAL 5 1000
5 EMP 5 M
6 SAL 5 ABC-NEW 750
现在我想查询 MY_TABLE 以获取所有列的最新更改的员工数据,结果应该是这样的行:
EMP_ID FIRST_NAME LAST_NAME GENDER SALARY
5 ABC-NEW XYZ-NEW M 750
到目前为止,我所做的是为每一列获取 MAX(ID),并从该 ID 再次查询表以获取该 ID 的列值。
但问题是这个查询会在 db 上承受相当大的负载,因为我有 25 个这样的列,并且表会随着时间的推移而变大。
那么,有人可以建议我更好的方法来编写下面的查询:
SELECT (SELECT FIRST_NAME FROM MY_TABLE WHERE ID = T2.FIRST_NAME_PK) AS FIRST_NAME
, (SELECT LAST_NAME FROM MY_TABLE WHERE ID = T2.LAST_NAME_PK ) AS LAST_NAME
, (SELECT GENDER FROM MY_TABLE WHERE ID = T2.GENDER_PK ) AS GENDER
, (SELECT SALARY FROM MY_TABLE WHERE ID = T2.SALARY_PK ) AS SALARY
FROM (SELECT (SELECT MAX(ID) FROM MY_TABLE WHERE EMP_ID = T1.EMP_ID AND FIRST_NAME IS NOT NULL) FIRST_NAME_PK -- ID = 6
, (SELECT MAX(ID) FROM MY_TABLE WHERE EMP_ID = T1.EMP_ID AND LAST_NAME IS NOT NULL) LAST_NAME_PK -- ID = 3
, (SELECT MAX(ID) FROM MY_TABLE WHERE EMP_ID = T1.EMP_ID AND GENDER IS NOT NULL) GENDER_PK -- ID = 5
, (SELECT MAX(ID) FROM MY_TABLE WHERE EMP_ID = T1.EMP_ID AND SALARY IS NOT NULL) SALARY_PK -- ID = 6
FROM (SELECT DISTINCT EMP_ID
FROM MY_TABLE
) T1
) T2;
【问题讨论】:
-
发布示例数据的创建、插入语句并显示您想要的输出。
-
请解释您为什么要这样做。您没有包含当前值的员工表吗?然后,您只需读取此表,这当然比从日志表中收集数据要快得多。
-
@ThorstenKettner,我只想获取在表上完成的任何更新,所以如果最初在创建员工记录时输入了所有字段。然后只更改拳头名称,然后我只想要名字而不是其他列值。我只想获取已更改的最新数据。
标签: sql oracle performance max