У меня много таблиц и резервных таблиц.Каждая таблица имеет 250+ столбцов.Теперь я хочу сравнить каждую таблицу с ее резервной таблицей и перечислить строки, которые были изменены.И нужно отображать данные только столбца измененных данных.Если определенный столбец не изменился, эти данные будут отображаться как ноль.
Пример.
Table_X
---------------------------------------------------
|EmployeeID |Name |Age |...|Address |
---------------------------------------------------
|EMP001 |Raju |35 |...|Bangalore |
|EMP002 |Gopal |40 |...|Chennai |
---------------------------------------------------
Table_X_Backup
---------------------------------------------------
|EmployeeID |Name |Age |...|Address |
---------------------------------------------------
|EMP001 |Raju |35 |...|Bangalore |
|EMP002 |Gopal |40 |...|Hyderabad |
---------------------------------------------------
Я хочу получить итоговую таблицу наборов изменений, как показано ниже.
Change_Set_Table_X
-----------------------------------------------
|EmployeeID |ChangedColumns |
-----------------------------------------------
|EMP002 |Address <Other Columns if Any> |
-----------------------------------------------
ИЛИ
Delta_Table_X
---------------------------------------------------
|EmployeeID |Name |Age |...|Address |
---------------------------------------------------
|EMP001 |NULL |NULL |...|NULL |
|EMP002 |NULL |NULL |...|CHANGED |
---------------------------------------------------
Примечание :
Использование Oracle DB
Столбцы - это разнородные типы данных (состоящие из varchar2, number и clob)
В каждой таблице более 250+ столбцов.Поэтому нельзя сравнивать столбец с столбцом вручную.Я нашел функцию, которая перечисляет все столбцы таблицы, это может помочь.
SELECT имя_ столбца FROM user_tab_cols WHERE table_name = 'Table_X';
SELECT LISTAGG(column_name, ',') внутри группы (упорядочено по column_name) FROM user_tab_cols где table_name = 'Table_X' и column_name не входит в группу (столбцы типа данных Clob) по table_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
/
Заранее спасибо.