F找出具有不同值的列名和列值

问题描述 投票:0回答:1

我有两个具有相同结构的表 A 和 B。

例如:A 有 id、name、adress 和 sex 列。类似地,表B具有相同的结构。 ID 是这两个表之间的链接。我想要的是打印 ID 、 Column_name 值不同的列表、 A 列值和 B 列值彼此不同的值。

我已附上参考输出的图像

sql oracle plsql plsqldeveloper
1个回答
0
投票

这将以人类和 SQL 可读的格式获取输出。这种事情可以通过多种方式来完成,以避免冗余,但这应该为您提供一个起点。

基本原理:对两个表进行逆透视,以便获得列名称和值的精简结果。然后你可以用不等式条件连接 id 和列名来获取不同的记录。

小提琴:https://dbfiddle.uk/EnOa7U7g

注意事项,谨防:

1.) 空值。 “<>”不适用于空值,如果您的数据可为空,则必须显式处理该问题。

2.) 两个表和数据类型之间的孤儿。为了简单起见,我有内部联接,所以如果你可以在 table_a 中拥有 id 而不能在 table_b 中拥有 id,反之亦然,你需要以某种适当的方式处理它。

3.) 数据类型,用许多信息重载列有时需要进行转换,而 Oracle 无法隐式执行此操作。

表_A

身份证 COLUMN_A COLUMN_B COLUMN_C
1 苹果 梨子 香蕉
2 猕猴桃 蓝莓 橙色

表_B

身份证 COLUMN_A COLUMN_B COLUMN_C
1 苹果 梨子 羽衣甘蓝
2 李子 玉米 橙色

结果

身份证 COLUMN_NAME A_VALUE B_VALUE
1 column_c 香蕉 羽衣甘蓝
2 列_a 猕猴桃 李子
2 列_b 蓝莓 玉米
create table table_a 
  (
    id int,
    column_a varchar(255),
    column_b varchar(255),
    column_c varchar(255)
  );

create table table_b 
  (
    id int,
    column_a varchar(255),
    column_b varchar(255),
    column_c varchar(255)
  );

insert into table_a values
  (1,'apple','pear','banana'),
  (2,'kiwi','blueberry','orange');

insert into table_b values
  (1,'apple','pear','kale'),
  (2,'plum','corn','orange');

with table_a_pivot as (
    select * 
      from table_a
    unpivot(
      val for column_name in (
        column_a as 'column_a',
        column_b as 'column_b',
        column_c as 'column_c'
      )
    )
    ),
table_b_pivot as (
    select * 
      from table_b
    unpivot(
      val for column_name in (
        column_a as 'column_a',
        column_b as 'column_b',
        column_c as 'column_c'
      )
    )
)
select table_a_pivot.id,
       table_b_pivot.column_name,
       table_a_pivot.val as a_value,
       table_b_pivot.val as b_value
  from table_a_pivot
 inner
  join table_b_pivot
    on table_a_pivot.id = table_b_pivot.id
   and table_a_pivot.column_name = table_b_pivot.column_name
   and table_a_pivot.val <> table_b_pivot.val;
© www.soinside.com 2019 - 2024. All rights reserved.