我有两个具有相同结构的表 A 和 B。
例如:A 有 id、name、adress 和 sex 列。类似地,表B具有相同的结构。 ID 是这两个表之间的链接。我想要的是打印 ID 、 Column_name 值不同的列表、 A 列值和 B 列值彼此不同的值。
我已附上参考输出的图像
这将以人类和 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;