2014-04-23 53 views
1

我的經理要求我編寫一份報告,比較以下兩個表的列名:使用SQL比較表

  • 英國員工
  • 美國員工

所以他不查找表中的任何數據,只是我們可以運行的一塊SQL來檢查列名並顯示名稱不在兩個數據庫中的列。一段SQL代碼或存儲過程會很好。

我只是一個DBA現在幾個月,我不知道從哪裏開始。

任何幫助將不勝感激。

+1

您正在使用哪些DBMS? Postgres的?甲骨文? –

+0

即時通訊使用Oracle,抱歉,我忘了包括它。 – user3481395

+0

我的經理稱它爲某種「報告」。 – user3481395

回答

1

在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; 
+0

非常感謝,這是很多幫助。我現在瞭解我可以寫這個查詢的結構和類似的查詢。 – user3481395

2

以此爲起點,你可以做一個完整的外部兩個子查詢的加入對all_tab_columns,或user_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)。

當然,您可以在此基礎上展示不同的喜好。

+0

非常感謝,這真是太神奇了,在我看來,我只是有一個簡單的選擇明確的查詢。太棒了。 – user3481395