Найти все пары одинаковых столбцов в разных таблицах в базе данных - PullRequest
0 голосов
/ 06 ноября 2019

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

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

Вот некоторыеПример кода, который, я думаю, является началом этого типа запроса:

select DatabaseName,TABLENAME as Tab1,Columnname as Col1, TABLENAME as Tab2, Columnname as Col2
from DBC.ColumnsV
order by DatabaseName,TABLENAME;

DatabaseName Tab1 Col1 Tab2 Col2

Dat1 Table0 Col0 Table9 Col0

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Запрос Эндрюса упрощен:

SELECT DatabaseName, TableName, ColumnName,
   Count(*) Over (PARTITION BY ColumnName) AS Cnt
FROM dbc.ColumnsV
QUALIFY Cnt > 1 -- only repeated columns

Я думаю, этого достаточно для работы с данными, но если вам действительно нужны пары таблиц, вам нужно самостоятельное соединение:

WITH cte AS
 (
   SELECT DatabaseName, TableName, ColumnName,
      Count(*) Over (PARTITION BY ColumnName) AS Cnt
   FROM dbc.ColumnsV
   WHERE databasename = 'open_data'
   QUALIFY Cnt > 1 -- only repeated columns
 ) 
SELECT *
FROM cte AS t1
JOIN cte AS t2
  ON t1.ColumnName = t2.ColumnName       -- same column
WHERE t1.DatabaseName || '.' || t1.TableName < t2.DatabaseName || '.' || t2.TableName

OfКонечно, это значительно увеличит количество строк, и возвращает каждое имя таблицы один раз, таким образом, n*(n-1)/2 строк для n таблиц с одинаковым именем столбца.

Если вместо этого изменить условие на <>из < вы получите всех комбинаций и удвоенное количество строк, то есть e table1,table2 и table2,table1.

0 голосов
/ 06 ноября 2019

Сначала мы получим список имен столбцов, которые дублируются. Затем мы присоединяем это обратно к ColumnsV и получаем всю необходимую информацию об этих столбцах.

with cols as (
select 
columnname ,
count (*) as cnt
from
dbc.columnsv
group by columnname
having count (*) > 1)

select
columnsv.*
from 
dbc.columnsv
inner join cols
    on columnsv.columnname = cols.columnname
...