【问题标题】:Find all pairs of identical columns in different tables in a database查找数据库中不同表中的所有相同列对
【发布时间】:2019-11-07 05:28:47
【问题描述】:

我想在整个数据库(或跨数据库)的不同表中找到相同的列标题。我正在尝试了解每个表中的唯一键或外键与多数据库 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

【问题讨论】:

    标签: sql teradata


    【解决方案1】:

    安德鲁斯查询简化:

    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表。

    如果您将条件更改为&lt;&gt; 而不是&lt;,您将获得所有 组合和两倍的行数,即table1,table2table2,table1。 p>

    【讨论】:

    • 这仅适用于一对,如果列名存在于 3 个(或更多)表中怎么办?呃。
    • @Andrew:我有 342 个表,其中有一列名为 DatabaseName :-) 我更喜欢你的方法。
    • 我很欣赏你的这两种方法!
    【解决方案2】:

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

    【讨论】:

    • 感谢安德鲁的及时回复。这似乎与我所追求的很接近。我认为databasename tablename 和columname 是columname 的第一个实例?有什么方法可以在此输出中获取该对 databasename 表名?
    猜你喜欢
    • 2020-02-12
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多