用于比较Oracle中多个表中的列的查询
我有3个表,它们具有相似的列和相同的主键,让我们称它们为表T1、T2和T3。 这些表的列数并不完全相同,但所有3个表中都存在一些列 我希望能够,给定T1、T2和T3的表名:用于比较Oracle中多个表中的列的查询,oracle,Oracle,我有3个表,它们具有相似的列和相同的主键,让我们称它们为表T1、T2和T3。 这些表的列数并不完全相同,但所有3个表中都存在一些列 我希望能够,给定T1、T2和T3的表名: 列出(T1+T2+T3)中的所有列 对于每一列,我希望看到: 对于每个表,如果它们存在或不存在 如果存在,则其值(*) 各表中各值的比较(*) (*)用于特定记录 如下所示,其中“-”表示该表不存在该列: Column T1 T2 T3 Comparison -------
- 对于每个表,如果它们存在或不存在
- 如果存在,则其值(*)
- 各表中各值的比较(*)
Column T1 T2 T3 Comparison
------- ---- ---- ---- ----------
C1 "A" "A" "A" EQUAL
C2 - "B" "B" DIFFERENT
C3 "C" null "C" DIFFERENT
C4 "D" "E" "F" DIFFERENT
C5 - "G" - DIFFERENT
C6 null null null EQUAL
有什么办法吗?我可以帮你解决第一部分。如果每个表中都有该列,则会用“X”标记
select column_name
,max(case when owner = 'schema' and table_name = 'T1' then 'X' end) as t1
,max(case when owner = 'schema' and table_name = 'T2' then 'X' end) as t2
,max(case when owner = 'schema' and table_name = 'T3' then 'X' end) as t3
from all_tab_columns
where (owner = 'schema' and table_name = 'T1')
or (owner = 'schema' and table_name = 'T2')
or (owner = 'schema' and table_name = 'T3')
group
by column_name;
T1/C1=“A”表示T1中的所有行在C1列中具有相同的值,即字符串“A”?这当然是一个罕见的案例。通常一列中会有许多不同的值。这就是
null
所代表的吗?是的。。。但是您可以查询ALL\u TAB\u COLUMNS
dictionary表中这些表的条目,以获得列列表。。。。然后,您可以连接它来比较表中的列,并将其转换为您的格式。PIVOT
。。。。然后,您需要动态SQL来比较这些值—假设每个表中有多行,您希望如何执行比较?很抱歉造成混淆,我忘了提到示例中显示的值是针对特定记录的。我编辑了原始问题以澄清这一点。谢谢@Ronnis,这确实解决了部分问题!