在数据库中的不同表中查找所有成对的相同列

Find all pairs of identical columns in different tables in a database

我想在整个数据库(或跨数据库)的不同 table 中找到相同的列 headers。我正在尝试了解在 multi-database SQL 环境(使用 Teradata)中,每个 table 中的唯一键或外键与其他 table 中的其他键匹配是什么,我认为这样的查询会加快这个过程。

我知道如何查询数据库名,table名,和列名,但我不知道如何指定一个条件到return只有列headers一个 table 存在于另一个 table

下面是一些示例代码,我认为它是此类查询的开始:

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

数据库名称 Tab1 Col1 Tab2 Col2

Dat1 Table0 Col0 Table9 Col0

首先我们将得到一个列名重复的列表。然后我们将其连接回 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

Andrews 查询简化:

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

我认为这是足够的数据来处理,但如果你真的想要成对的 table,你需要一个自连接:

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

当然这样会大大增加行数,它returns每个table命名一次,因此n*(n-1)/2行为ntable s 具有相同的列名。

如果您将条件更改为 <> 而不是 < 您将获得 所有 组合和两倍的行数,即 table1,table2table2,table1.