@hikamurachi

Как найти общие поля в таблицах?

Есть 2 таблицы A и B, в каждой из них N-ое кол-во полей.
Необходимо найти поля по которым можно было бы выполнить JOIN двух таблиц.
В запросе надо найти поля в которых есть одинаковые данные
  • Вопрос задан
  • 182 просмотра
Пригласить эксперта
Ответы на вопрос 3
@alexalexes
Если задача на знание справочника SQL, то есть такая конструкция:
таблица1 join таблица2 using (общие_имена_полей)
это эквивалент:
таблица1 join таблица2 on таблица1.общее_имя_поле = таблица2.общее_имя_поле...

Вариант с using будет работать, если выдерживается культура именования, при которой в названии поля есть название таблицы.
Ответ написан
tsklab
@tsklab
Здесь отвечаю на вопросы.
Никак.
Есть исключение
Если суррогатный ключ GUID, то по одинаковым значениям можно определить связь. В 1С, например.

Есть программы и сервисы, которые импортируют таблицы и их связи (если нет их нет, то без них) из баз данных в диаграмму. Но оная строится не на основе данных, а по предметной области.
Ответ написан
Комментировать
@Olteya
Фактически задача сводится к поиску количества совпадений значений каждого атрибута таблицы А со значениями каждого атрибута таблицы Б.

Можно попробовать используя метаданные построить список запросов вида:
select
(select count(*) from A where A.column_name1 in (select B.column_name1 from B )) as column_name1_x_column_name1,
(select count(*) from A where A.column_name1 in (select B.column_name2 from B )) as column_name1_x_column_name2 и т.д.


Пример для postgres:
with B as
(
select table_name, column_name, data_type from information_schema.columns c where c.table_name in ('product') --название таблицы А
)
, common as (
select A.table_name A_table_name, A.column_name A_column_name,
	B.table_name B_table_name, B.column_name B_column_name from information_schema.columns as A
inner join  B on  A.data_type = B.data_type
where A.table_name in ('printer') --название таблицы Б
)

select '(select count(*) from ' || common.A_table_name || ' where ' || common.A_column_name || ' in (select '|| B_column_name || ' from ' || B_table_name || ' )) as ' || A_column_name || '_x_' || B_column_name || ',' from common

Вариант соединения для примера сделан по типам данных.
Далее оборачиваете еще в один select и выполняете.
Получается что-то вроде:
65ccf2ae8fa9e028148349.jpeg где видно количество совпадений.
Результат, конечно, не означает, что по этим полям можно соединять таблицы. Это могут быть ссылки на таблицу С, например. Или совпадающие даты. Дальше нужно анализировать.
Если правильно понимаю, у автора таблицы с большим количеством столбцов без описания. Так можно хотя бы сузить диапазон поиска.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы