我的經理要求我編寫一份報告,比較以下兩個表的列名:使用SQL比較表
- 英國員工
- 美國員工
所以他不查找表中的任何數據,只是我們可以運行的一塊SQL來檢查列名並顯示名稱不在兩個數據庫中的列。一段SQL代碼或存儲過程會很好。
我只是一個DBA現在幾個月,我不知道從哪裏開始。
任何幫助將不勝感激。
我的經理要求我編寫一份報告,比較以下兩個表的列名:使用SQL比較表
所以他不查找表中的任何數據,只是我們可以運行的一塊SQL來檢查列名並顯示名稱不在兩個數據庫中的列。一段SQL代碼或存儲過程會很好。
我只是一個DBA現在幾個月,我不知道從哪裏開始。
任何幫助將不勝感激。
在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;
非常感謝,這是很多幫助。我現在瞭解我可以寫這個查詢的結構和類似的查詢。 – user3481395
以此爲起點,你可以做一個完整的外部兩個子查詢的加入對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)。
當然,您可以在此基礎上展示不同的喜好。
非常感謝,這真是太神奇了,在我看來,我只是有一個簡單的選擇明確的查詢。太棒了。 – user3481395
您正在使用哪些DBMS? Postgres的?甲骨文? –
即時通訊使用Oracle,抱歉,我忘了包括它。 – user3481395
我的經理稱它爲某種「報告」。 – user3481395