我有两个表表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
答案 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