Как написать запрос для поиска таблиц с похожими столбцами? - PullRequest
0 голосов
/ 27 июня 2018

Я ищу написать запрос, чтобы узнать таблицы с похожими столбцами. Причина в том, что в нашей тестовой среде никто ничего не чистил целую вечность, и это помогло бы нам разобраться и вывести таблицы с похожими столбцами.

В настоящее время в базе данных имеется 200 таблиц, и трудно определить, в которой содержится аналогичная информация, поскольку имена некоторых таблиц могут отличаться, но поля будут одинаковыми.

например.

Таблица A будет выглядеть так:

ID Имя Описание

Таблица B будет выглядеть так:

Имя ID

А таблица B может содержать или не содержать одни и те же данные.

Моя идея - получить результат в этом формате.

Result

Спасибо за чтение!

1 Ответ

0 голосов
/ 27 июня 2018

Попробуйте это:

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 .

...