比较两个表并获取记录的新旧值

时间:2019-09-16 13:30:44

标签: sql oracle

我有两个表表A(主表)-250列和表b(历史表)-240列, 我需要创建动态查询,因为我的表有250列。使用oracle

suppose:  Table A(Master table)

ID  Name    City    Phone   Category 
---------------------------------------
111 ABC    Delhi    123456  Red
112 BCD    Mumbai   234987  Green
113 CGU    PUNE     987456  Black

suppose:  Table B(History table)



 ID  City   Phone   Category 
 ---------------------------------
 111 Kerala 123456  White 
 113 Jammu  577756  Black

我需要输出类似的东西

ID  changes column name Old_value   new_value
----------------------------------------------------------
111         City        Kerala      Delhi
111         Category    White       Red
113         City        Jammu       Pune 
113         Phone       987456      577756

但这不是动态的,我正在使用oracle

select distinct 
  hist.ID, 
  'city' as Changed_Column, 
  hist.cityas Old_Value, 
  daily.cityas New_Value
from table A dly  daily 
inner join table b hist on daily.ID= hist.ID
  and daily.city <> hist.city

1 个答案:

答案 0 :(得分:2)

使用UNPIVOT将各表中的列转换为行,然后将两者合并:

Oracle设置

CREATE TABLE TableA ( ID, Name, City, Phone, Category ) AS
SELECT 111, 'ABC', 'Delhi',  '123456', 'Red'   FROM DUAL UNION ALL
SELECT 112, 'BCD', 'Mumbai', '234987', 'Green' FROM DUAL UNION ALL
SELECT 113, 'CGU', 'PUNE',   '987456', 'Black' FROM DUAL;

CREATE TABLE TableB ( ID, City, Phone, Category ) AS
SELECT 111, 'Kerala', '123456', 'White' FROM DUAL UNION ALL
SELECT 113, 'Jammu',  '577756', 'Black' FROM DUAL

查询

SELECT a.id,
       a.column_name,
       a.old_value,
       b.new_value
FROM   (
         SELECT id, column_name, old_value
         FROM   TableA
         UNPIVOT ( old_value FOR column_name IN ( City, Phone, Category ) )
       ) a
       INNER JOIN
       (
         SELECT id, column_name, new_value
         FROM   TableB
         UNPIVOT ( new_value FOR column_name IN ( City, Phone, Category ) )
       ) b
       ON ( a.id = b.id AND a.column_name = b.column_name )
WHERE a.old_value <> b.new_value

输出

 ID | COLUMN_NAME | OLD_VALUE | NEW_VALUE
--: | :---------- | :-------- | :--------
111 | CITY        | Delhi     | Kerala   
111 | CATEGORY    | Red       | White    
113 | CITY        | PUNE      | Jammu    
113 | PHONE       | 987456    | 577756   

db <>提琴here