Попробуйте это:
WITH PrepareData AS
(
SELECT c1.TABLE_CATALOG AS c1_Cat,c1.TABLE_SCHEMA AS c1_Sch,c1.TABLE_NAME AS c1_Nam
,c2.TABLE_CATALOG AS c2_Cat,c2.TABLE_SCHEMA AS c2_Sch,c2.TABLE_NAME AS c2_Nam
,COUNT(*) AS IdenticalColumns
,(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS x WHERE x.TABLE_CATALOG=c1.TABLE_CATALOG
AND x.TABLE_SCHEMA=c1.TABLE_SCHEMA
AND x.TABLE_NAME=c1.TABLE_NAME) AS CountT1
,(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS x WHERE x.TABLE_CATALOG=c2.TABLE_CATALOG
AND x.TABLE_SCHEMA=c2.TABLE_SCHEMA
AND x.TABLE_NAME=c2.TABLE_NAME) AS CountT2
FROM INFORMATION_SCHEMA.COLUMNS c1
FULL OUTER JOIN INFORMATION_SCHEMA.COLUMNS c2 ON c1.TABLE_NAME<>c2.TABLE_NAME
AND c1.COLUMN_NAME=c2.COLUMN_NAME
WHERE c1.TABLE_NAME IS NOT NULL AND c2.TABLE_NAME IS NOT NULL
GROUP BY c1.TABLE_CATALOG,c1.TABLE_SCHEMA,c1.TABLE_NAME
,c2.TABLE_CATALOG,c2.TABLE_SCHEMA,c2.TABLE_NAME
)
,ComputeSimilarity AS
(
SELECT *
,CAST(IdenticalColumns AS FLOAT) / CAST(CountT1 AS FLOAT) AS Factor1
,CAST(IdenticalColumns AS FLOAT) / CAST(CountT1 AS FLOAT) AS Factor2
FROM PrepareData
)
SELECT *
FROM ComputeSimilarity
WHERE Factor1>0.75 OR Factor2>0.75;
Идея: объединить все столбцы на с тем же именем столбца, но с другим именем таблицы . Подсчитайте соответствующие столбцы и свяжите их с общим количеством столбцов.
Подсказка: это также возвращает ВИДЫ. Вы можете присоединиться INFORMATION_SCHEMA.TABLES
, чтобы найти тип.
Подсказка2: Вы получаете каждый результат дважды, один с A до B и снова с B до A .