2008-11-06 78 views
2

我有4個數據庫具有相似的模式,我試圖創建一個查詢來返回僅存在於數據庫1中並且不存在於數據庫2中的表,列對,3或4跨SQL數據庫尋找獨特的表/列組合

目前我可以通過下面的查詢返回數據庫1和2之間的對稱差...

select table_name, column_name from (
     select table_name, column_name from [Database1].information_schema.columns 
     union all 
     select table_name, column_name from [Database2].information_schema.columns) as tmp 
     group by table_name, column_name having count(*) = 1 

然而,在試圖找出剛剛在數據庫1的那些列,並在所有4個數據庫中做同樣的事情,事情變得越來越複雜。這個查詢最乾淨的解決方案是什麼?

回答

1
SELECT 
    D1.table_name, 
    D1.column_name 
FROM 
    Database1.information_schema.columns D1 
LEFT OUTER JOIN Database2.information_schema.columns D2 ON 
    D2.table_name = D1.table_name AND 
    D2.column_name = D1.column_name 
LEFT OUTER JOIN Database3.information_schema.columns D3 ON 
    D3.table_name = D1.table_name AND 
    D3.column_name = D1.column_name 
LEFT OUTER JOIN Database4.information_schema.columns D4 ON 
    D4.table_name = D1.table_name AND 
    D4.column_name = D1.column_name 
WHERE 
    D2.table_name IS NULL AND 
    D3.table_name IS NULL AND 
    D4.table_name IS NULL 
+0

你有一個尾隨AND – Blorgbeard 2008-11-06 21:05:19

1

我可以想出第一槍,這可以是一個良好的開端。這還沒有經過測試,只是另一種選擇可能:

select table_name, column_name from [Database1].information_schema.columns d1 
where table_name || '+' || column_name 
not in (select table_name || '+' || column_name from [Database2].information_schema.columns) 

and table_name || '+' || column_name 
not in (select table_name || '+' || column_name from [Database3].information_schema.columns) 

and table_name || '+' || column_name 
not in(select table_name || '+' || column_name from [Database4].information_schema.columns)