2008-11-06 5 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

У вас есть trailing 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) 
Смежные вопросы