2015-04-27 21 views
0

是否有任何方法在Oracle中創建SQL語句以僅顯示已更改的字段?我們有一個數據表和一個相關的審計表,具有相同的字段名稱。我可以加入他們在適當的鍵字段,然後我可以單獨檢查各個領域的變化:Oracle查詢只顯示更改的記錄?

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號,我每行具有至少一個改變的領域,但我必須接着看到所有的結果,找出哪些領域發生了變化。

看來我應該能夠做一些基本上說「對於表中的每個字段,如果它不匹配其他表顯示字段名稱和值」的查詢。

這一切都需要在SQL中完成,因爲企業要求我們使用獨立的查詢/報告工具,無法在Oracle後端數據庫上創建任何對象(表,視圖,觸發器,SP等)。

+0

你正在尋找的財產以後[像這樣]有用(http://stackoverflow.com/a/7743813/119477) –

回答

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

HI,檢查「減」運算符,它可能是有用。 http://psoug.org/definition/minus.htm – Ramki

+0

CASE WHEN技術的工作,我已經嘗試過,但它仍然意味着編碼每個特定列,並且還返回沒有變化的列。 理想情況下,我想只顯示已更改的列......並且不必將每列編碼到實際的SQL中,如果可能的話...我認爲這些可能是一種創建某種臨時表的方法在內存中,某種方式可能會被查詢爲「FOR TEMPTABLE ....」中的每一列「,但我不是一個足夠先進的Oracle SQL編碼器來知道是否/如何做這樣的事情。 –

+0

@Brian你可以在PL/SQL中使用動態查詢。但不是在普通的SQL。 –

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在運行時構建您的代碼。

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;