是否有任何灵巧的方法在Oracle中创建SQL语句以仅显示已更改的字段?我们有一个Data表和一个相关的Audit表,它们具有相同的字段名。我可以在正确的关键字段上加入它们,然后我可以单独检查每个字段的变化:
SELECT
t.FIELD1,
a.FIELD1 AUDIT_FIELD1,
t.FIELD2,
a.FIELD2 AUDIT_FIELD2,
t.FIELD3,
a.AUDIT_FIELD3,
etc
...
FROM
DATA_TABLE t
INNER JOIN
AUDIT_TABLE a
ON
a.EMP_ID = t.EMP_ID
...
WHERE
a.FIELD1 <> t.FIELD1
OR
a.FIELD2 <> t.FIELD2
OR
a.FIELD3 <> t.FIELD3
etc etc..
我最后得到X行,其中每行至少有一个更改的字段,但我必须仔细检查所有结果以找出哪些字段已更改。
似乎我应该能够进行某种基本上表示&#34;对于表中的每个字段的查询,如果它不匹配其他表显示字段名称和值。&#34;
这一切都需要在SQL中完成,因为公司要求我们使用单独的查询/报告工具,该工具无法在Oracle后端数据库上创建任何对象(表,视图,触发器,SP等)
答案 0 :(得分:0)
以下情况会怎样?它会指示哪些字段已更改为每个字段的Y / N列,因为多个字段可能已更改。
SELECT
CASE WHEN a.FIELD1 <> t.FIELD1 THEN 'Y' ELSE 'N' END AS FIELD1CHANGED,
CASE WHEN a.FIELD2 <> t.FIELD2 THEN 'Y' ELSE 'N' END AS FIELD2CHANGED,
CASE WHEN a.FIELD3 <> t.FIELD3 THEN 'Y' ELSE 'N' END AS FIELD3CHANGED,
...
答案 1 :(得分:0)
更传统的方法是推动自己的审核。在表中添加一个触发器,伪代码
when insert, update or delete for each row
IF inserting then
Insert into your_table_audit (fields) Values(:old.id,...,...'INSERT');
Elsif updating then
Case
..compare all field values to find changed values
End
Insert into your_table_audit (fields) Values(:old.id,...,...'Changed '||:old.value||' to '||:new.value);
Else
Insert into your_table_audit (fields) Values(:old.id,...,...'DELETE');
这可以封装在一个包中,并将一些工作应用于任何表。您必须从Oracle元数据中访问列的名称,然后使用动态SQL在运行时构造代码。
答案 2 :(得分:0)
检查这可能有用
create table tab1 (
col1 varchar(10),
col2 varchar(10),
col3 Number(10)
);
insert into Tab1 values ('xxx','xxx',99);
insert into Tab1 values ('aaa','aaa',98);
insert into Tab1 values ('bbb','bbb',97);
create table tab2 (
col1 varchar(10),
col2 varchar(10),
col3 Number(10)
);
insert into Tab2 values ('xxx','xxx',99);
insert into Tab2 values ('aaaA','aaa',98);
insert into Tab2 values ('bbb','bbbB',97);
commit;
select col1,col2,col3 from tab2
minus
select col1,col2,col3 from tab1
---------- ---------- ----------------------
COL1 COL2 COL3
---------- ---------- ----------------------
aaaA aaa 98
bbb bbbB 97
--drop table tab1;
--drop table tab2;