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

时间:2019-11-06 19:21:55

标签: sql teradata

我想在整个数据库(或跨数据库)的不同表中找到相同的列标题。我正在尝试了解在多数据库SQL环境(使用Teradata)中每个表中的唯一键或外键是否与其他表中的其他键相匹配,并且我认为这样的查询将加快该过程。

我知道如何查询数据库名称,表名称和列名称,但是我不知道如何指定条件以仅返回存在于另一表中的一个表中的列标题

以下是我认为是此类查询的入门示例代码:

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

Andrews查询简化:

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

当然,这将大大增加行数,它返回每个表名一次,因此n*(n-1)/2行的n行具有相同的列名。

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