2008-11-06 75 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)