Sql 比较并列出有数据更改的两个表的列数据。(类似于减号,但只需列出数据已更改的列)

Sql 比较并列出有数据更改的两个表的列数据。(类似于减号,但只需列出数据已更改的列),sql,oracle,compare,Sql,Oracle,Compare,我有很多桌子和它的备用桌子。每个表有250多列。现在,我想将每个表与其备份表进行比较,并列出已更改的行。并且只需要显示更改数据的数据列。如果特定列未更改,则该数据将显示为null 例如 表X --------------------------------------------------- |EmployeeID |Name |Age |...|Address | --------------------------------------------------

我有很多桌子和它的备用桌子。每个表有250多列。现在,我想将每个表与其备份表进行比较,并列出已更改的行。并且只需要显示更改数据的数据列。如果特定列未更改,则该数据将显示为null

例如

表X

---------------------------------------------------
|EmployeeID  |Name    |Age    |...|Address        |
---------------------------------------------------
|EMP001      |Raju    |35     |...|Bangalore      |
|EMP002      |Gopal   |40     |...|Chennai        |
---------------------------------------------------
表X\u备份

---------------------------------------------------
|EmployeeID  |Name    |Age    |...|Address        |
---------------------------------------------------
|EMP001      |Raju    |35     |...|Bangalore      |
|EMP002      |Gopal   |40     |...|Hyderabad      |
---------------------------------------------------
我希望得到如下所示的变更集表

更改设置表格

-----------------------------------------------
|EmployeeID  |ChangedColumns                  |
-----------------------------------------------
|EMP002      |Address <Other Columns if Any>  |
-----------------------------------------------
注:

使用oracledb

列是由varchar2、number和clob组成的异构数据类型

每个表中有250多列。因此,无法手动对列进行比较。我发现了一个函数,它列出了表的所有列,这可能会有所帮助

选择列名称 来自用户选项卡 其中table_name='table_X'

从user_tab_cols(其中table_name='table_X'和column_name不在Clob数据类型group by table_name的列中)中选择ListAgColumn_name、'、'

我试过的代码。请建议即兴编写有效的代码

Insert into Delta_Table_X
With
A as (Select EmployeeID, Name, Age, ..., Address from Table_X MINUS Select EmployeeID, Name, Age, ..., Address from Table_X_Backup),
B as (Select EmployeeID, Name, Age, ..., Address from Table_X_Backup MINUS Select EmployeeID, Name, Age, ..., Address from Table_X)
Select 
A.EmployeeID "EmployeeID",
Case when nvl(A.Name, 'NULL') <> nvl(B.Name, 'NULL') then null else 'CHANGED' end "Name",
Case when nvl(A...., 'NULL') <> nvl(B...., 'NULL') then null else 'CHANGED' end "...",
Case when nvl(A.Address, 'NULL') <> nvl(B.Address, 'NULL') then null else 'CHANGED' end "Address"
FROM
A join B
on A.EmployeeID = B.EmployeeID
/

提前谢谢。

这看起来像是给我一个代码问题。到目前为止,你的尝试是什么?告诉我们你尝试了什么?表上有一个主键/唯一键吗?@KaushikNayak,当然我在看一个有效的代码。如果你知道有效解决问题的方法,那将是一个很大的帮助@nikhilsugandh,目前我已经尝试了暴力集操作+暴力技术。当nvlA.EmployeeID、'NULL'nvlB.EmployeeID、'NULL'然后NULL else'更改'结束EmployeeID时,使用A as select from Table\u X减去select from Table\u Backup,B as select from Table\u\u Backup减去select from Table\u\u备份;
Insert into Delta_Table_X
With
A as (Select EmployeeID, Name, Age, ..., Address from Table_X MINUS Select EmployeeID, Name, Age, ..., Address from Table_X_Backup),
B as (Select EmployeeID, Name, Age, ..., Address from Table_X_Backup MINUS Select EmployeeID, Name, Age, ..., Address from Table_X)
Select 
A.EmployeeID "EmployeeID",
Case when nvl(A.Name, 'NULL') <> nvl(B.Name, 'NULL') then null else 'CHANGED' end "Name",
Case when nvl(A...., 'NULL') <> nvl(B...., 'NULL') then null else 'CHANGED' end "...",
Case when nvl(A.Address, 'NULL') <> nvl(B.Address, 'NULL') then null else 'CHANGED' end "Address"
FROM
A join B
on A.EmployeeID = B.EmployeeID
/