识别Oracle SQL中两个不同select语句的列更改

soat7uwm  于 2023-08-04  发布在  Oracle
关注(0)|答案(1)|浏览(118)

我正在寻找一个解决方案来做下面的问题在Oracle SQL端。
以下是问题陈述:我有两个查询得到结果,我需要将列值相互比较,如果值不同,则响应列名:

result1 = select id, name, address, age from Table1 where runId = 1;   
result2 = select id, name, address, age from Table1 where runId = 2;

字符串
我需要比较result1.nameresult2.name的值,以及result1.addressresult2.address的值...类似地,只有当result1.id = result2.id匹配并且值有任何变化(假设列仅为varchar类型)时,才会针对该ID响应该特定列。
示例如下:
结果1:
| 名称,名称|地址|年龄| age |
| --|--|--| ------------ |
| 约翰|加1|二十三| 23 |
| 狮子座|加法-2|三十四| 34 |
| 保罗|加法-3|三十五| 35 |
结果二:
| 名称,名称|地址|年龄| age |
| --|--|--| ------------ |
| 约翰·保罗|加1|二十七| 27 |
| 狮子座|加法-2|三十九| 39 |
产出
| columnName| columnName |
| --| ------------ |
| 名称,名称| name |
| 年龄| age |
| 年龄| age |
注:如果单个查询无法实现上述逻辑,则可以通过返回上述格式来接受Oracle过程。代替姓名、地址、年龄,在真实的查询中可以有更多的列需要比较,因此性能不应该受到影响,因为这里的行数可以是数百万条记录。如果Oracle中的并行处理可以在这里使用,那就太好了。

nnvyjq4y

nnvyjq4y1#

您可以:

with q as (
  select coalesce(a.id, b.id) as id,
    a.name as aname, a.address as aaddress, a.age as aage,
    b.name as bname, b.address as baddress, b.age as bage
  from result1 a
  full join result2 b on b.id = a.id -- remove "full" for simpler comparison
)
select id, 'name' as column_name from q where decode(aname, bname, 1, 0) = 0
union all
select id, 'address' from q where decode(aaddress, baddress, 1, 0) = 0
union all
select id, 'age' from q where decode(aage, bage, 1, 0) = 0
order by id, 2;

字符串
测试结果:

ID  COLUMN_NAME 
 --- ----------- 
 1   age         
 1   name        
 2   age         
 3   address     
 3   age         
 3   name


还有:

ID  COLUMN_NAME 
 --- ----------- 
 1   age         
 1   name        
 2   age


分别。参见db<>fiddle上的运行示例。

相关问题