Oracle select 语句显示两个表中的匹配列?没有数据,只有两个表中都存在的列名
Posted
技术标签:
【中文标题】Oracle select 语句显示两个表中的匹配列?没有数据,只有两个表中都存在的列名【英文标题】:Oracle select statement to show matching columns in two tables ? No data just the column names that exist in both the tables 【发布时间】:2021-02-04 18:47:07 【问题描述】:如何在 oracle db 的两个表中显示所有相似的列?
【问题讨论】:
【参考方案1】:听起来你只是想要这样的东西。
select t1.column_name
from all_tab_columns t1
where t1.owner = <<table1 owner>>
and t1.table_name = <<table1 name>>
intersect
select t2.column_name
from all_tab_columns t2
where t2.owner = <<table1 owner>>
and t2.table_name = <<table1 name>>
如果您愿意,也可以将其写为join
或exists
。但从可读性的角度来看,intersect
对我来说更有意义。您可以使用dba_tab_columns
或user_tab_columns
而不是all_tab_columns
,具体取决于您在数据库中拥有的权限、您是否知道这些表在您当前的架构中等等。
【讨论】:
您好 Justin,上面的脚本在 t1.owner 处引发了 Invalid Identifier 错误。有什么建议么 ?两个表都在相同的模式中,我所做的只是将 ODB 添加到 t1.owner = 'odb' 和 t1.table_name = 'xyz'。 @sree - 对不起,脑子放个屁。引用了错误的表。【参考方案2】:另一种方法是聚合:
select atc.column_name,
(case when count(*) = 2 then 'Both'
when min((atc.owner) = :owner1 and min(atc.table_name) = :table1
then 'Table1 only'
else 'Table2 only'
end)
from all_tab_columns atc
where (atc.owner = :owner1 and atc.table_name = :table1) or
(atc.owner = :owner2 and atc.table_name = :table2)
group by atc.column_name;
这种方法的优点是它很容易推广到显示所有列:
select atc.column_name
from all_tab_columns atc
where (atc.owner = :owner1 and atc.table_name = :table1) or
(atc.owner = :owner2 and atc.table_name = :table2)
group by atc.column_name
having count(*) = 2;
【讨论】:
以上是关于Oracle select 语句显示两个表中的匹配列?没有数据,只有两个表中都存在的列名的主要内容,如果未能解决你的问题,请参考以下文章
oracle中,将两个select语句的结果作为一个整体显示出来