【问题标题】:How to get columns that are repeating in different tables in a database inside SQL Server [duplicate]如何获取在 SQL Server 内部数据库的不同表中重复的列[重复]
【发布时间】:2019-10-12 20:59:07
【问题描述】:

我有一个包含大量表的数据库。从这些表中,我想列出出现在多个表中的所有列名及其表名。

我尝试谷歌搜索找到任何合适的文章,可以解释如何实现我在问题部分中描述的结果。

无代码sn-ps

没有错误消息。

【问题讨论】:

  • 如果您搜索,我会很惊讶您一无所获。我建议查看INFORMATION_SCHEMA.COLUMNSsys.columnssys.tables

标签: sql-server tsql


【解决方案1】:

下面的查询将返回列名及其在当前数据库表中出现的次数:

SELECT c.NAME AS 'ColumnName', COUNT(*) AS Occurences
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
GROUP BY c.NAME
HAVING COUNT(*) > 1

下面的这个查询将有助于确定具体的列名放置在哪些表中:

-- Find column name in all the tables
SELECT c.NAME AS 'ColumnName', t.NAME AS 'TableName'
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.NAME LIKE '%columnname%' -- to be searchable column name
ORDER BY TableName, ColumnName;

【讨论】:

    【解决方案2】:

    这将返回列名和表名:

    select distinct 
    TABLE_NAME, 
    COLUMN_NAME 
    from INFORMATION_SCHEMA.COLUMNS where COLUMN_NAME in(
        select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS
        group by COLUMN_NAME
        having count(*) > 1
    )
    order by TABLE_NAME, COLUMN_NAME
    

    【讨论】:

    • 谢谢@idstam,这个查询适合我的需要。
    【解决方案3】:

    有很多结果和 sn-ps 显示了如何获取数据库中的所有列名。这是对sys.columns 的单个查询,例如:

    select Name
    from sys.columns
    

    在任何表中返回多次出现的相同 SQL 查询也可以在这里使用,例如:

    select Name,count(*)
    from sys.columns
    group by Name
    having count(*)>1
    

    将返回多次出现的列名。

    使用COUNT()OVER 可以在不连接的情况下获取列名和表名:

    with t as (
        select name,
               object_name(object_id) as TableName,
               count(*) over (partition by name) cnt
        from sys.columns
    )
    select * 
    from t
    where cnt >1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 2018-02-13
      • 2017-03-09
      • 2012-01-17
      • 2020-03-20
      • 2018-01-09
      相关资源
      最近更新 更多