在数据库中的不同表中查找所有成对的相同列
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
行为n
table s 具有相同的列名。
如果您将条件更改为 <>
而不是 <
您将获得 所有 组合和两倍的行数,即 table1,table2
和 table2,table1
.
我想在整个数据库(或跨数据库)的不同 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
行为n
table s 具有相同的列名。
如果您将条件更改为 <>
而不是 <
您将获得 所有 组合和两倍的行数,即 table1,table2
和 table2,table1
.