【问题标题】:Using SQL to compare tables使用 SQL 比较表
【发布时间】:2014-04-23 15:06:05
【问题描述】:

我的经理让我编写一份报告来比较以下两个表的列名:

  • 英国员工
  • 美国员工

所以他没有在表中查找任何数据,只是我们可以运行一段 SQL 来检查列名并显示名称不在两个数据库中的列。一段 SQL 代码或存储过程就可以了。

我现在才几个月的 DBA,我不知道从哪里开始。

任何帮助将不胜感激。

【问题讨论】:

  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?
  • 我正在使用 Oracle,抱歉我忘了包含它。
  • 我的经理称其为某种“报告”。
  • 例如,如果两个表都有 100 个相同的列,则它们不会显示。只有未在另一个表中复制的列。所以不会显示重复的列名。
  • 我想隐藏重复的列名。

标签: sql oracle comparison


【解决方案1】:

作为起点,您可以针对all_tab_columnsuser_tab_columns 对两个子查询进行完全外部联接(如果您同时拥有它们):

select usa.column_name as usa_column, uk.column_name as uk_column
from (
  select column_name from all_tab_columns
  where table_name = '<USA_TABLE_NAME>'
) usa
full outer join (
  select column_name from all_tab_columns
  where table_name = '<UK_TABLE_NAME>'
) uk
on uk.column_name = usa.column_name
order by nvl(usa.column_name, uk.column_name), uk.column_name;

这显示了出现在两者中的列。要隐藏那些只需添加:

where usa.column_name is null or uk.column_name is null

...order by 之前。

SQL Fiddle demo。 (或with Gordon's approach 为同一示例)。

当然,您可以在此基础上随心所欲地呈现差异。

【讨论】:

  • 非常感谢,这太棒了,在我看来,我脑子里只有一个简单的 select distinct 查询。这是完美的。
【解决方案2】:

Oracle中包含元数据信息的表/视图是all_tab_cols

下面是一个示例,说明如何比较两者中的列:

select column_name,
       (case when max(case when table_name = 'table1' then 1 else 0 end) = 0
             then 'InTable2'
             when max(case when table_name = 'table2' then 1 else 0 end) = 0
             then 'InTable1'
             else 'InBoth'
        end) as which
from all_tab_cols
where table_name in ('table1', 'table2')
group by column_name;

【讨论】:

  • 非常感谢,这对您有很大帮助。我现在了解了可以编写此查询和类似查询的结构。
猜你喜欢
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 2018-02-25
相关资源
最近更新 更多