【问题标题】:How to determine which columns are shared between two tables?如何确定两个表之间共享哪些列?
【发布时间】:2013-06-10 03:55:10
【问题描述】:

这里对 SQL Sever 非常陌生...我了解连接表等的概念,但是确定共享哪些列的最简单方法是什么?

假设我们有表 1 和表 2,假设表 1 和表 2 一样有 100 多列,但它们只有 1 列相同。

有没有一种简单的方法来查看共享的列/如果有,而无需烦人地进入和检查?

相当琐碎的问题,但非常有用。谢谢

【问题讨论】:

    标签: sql sql-server join


    【解决方案1】:

    您可以在INFORMATION_SCHEMA 表中找到类似的数据。从技术上讲,这些比sys 视图更标准化。 (见this question。)

    您可以使用以下查询:

    select A.COLUMN_NAME
    from INFORMATION_SCHEMA.COLUMNS A
    join INFORMATION_SCHEMA.COLUMNS B
      on A.COLUMN_NAME = B.COLUMN_NAME
    where A.TABLE_NAME = 'table1'
      and B.TABLE_NAME = 'table2'
    

    如果您需要指定架构以避免名称冲突,请将A.TABLE_SCHEMA = 'dbo' 等添加到where 子句中。

    【讨论】:

      【解决方案2】:

      这很可能表明存在基本设计问题,但要找到两个表共享的列名,有几个选项

      SELECT name 
      FROM sys.columns 
      WHERE object_id IN (object_id('dbo.Table1'),
                          object_id('dbo.Table2'))
      GROUP BY name
      HAVING COUNT(*) = 2
      

      或者

      SELECT name 
      FROM sys.columns 
      WHERE object_id = object_id('dbo.Table1')
      INTERSECT
      SELECT name 
      FROM sys.columns 
      WHERE object_id = object_id('dbo.Table2')
      

      【讨论】:

      • 我打算建议在 INFORMATION_SCHEMA.COLUMNS 上进行自我加入(类似于 Chad Henderson),但这非常巧妙。
      【解决方案3】:

      像这样使用 INFORMATION_SCHEMA.COLUMNS:

      IF OBJECT_ID('Table1') IS NOT NULL DROP TABLE Table1
      IF OBJECT_ID('Table2') IS NOT NULL DROP TABLE Table2
      GO
      CREATE TABLE Table1 (
          a INT
        , b INT
        , c INT
        , d INT
        , e INT
        , f INT
      )
      
      CREATE TABLE Table2 (
          c INT
        , d INT
        , e INT
        , f INT
        , g INT
        , h INT
        , i INT
      )
      
      GO
      
      SELECT t1.COLUMN_NAME 
      FROM        INFORMATION_SCHEMA.COLUMNS AS t1 
      INNER JOIN  INFORMATION_SCHEMA.COLUMNS AS t2 ON t1.COLUMN_NAME = t2.COLUMN_NAME 
      WHERE t1.TABLE_NAME = 'Table1' AND t2.TABLE_NAME = 'Table2'
      

      -- 输出

      COLUMN_NAME
      c
      d
      e
      f
      

      【讨论】:

        【解决方案4】:
        select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'Table1'
        
        intersect
        
        select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'Table2'
        

        【讨论】:

        • 欢迎来到 Stack Overflow!虽然欢迎使用此代码 sn-p,并且可能会提供一些帮助,但它将是 greatly improved if it included an explanation如何为什么 这可以解决问题。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。
        • INFORMATION_SCHEMA 在 oracle 中没有这样的东西??
        【解决方案5】:

        这是一个方便的查询,可用于列出表中的列:

        SELECT c.name ColumnName
        FROM sys.columns c INNER JOIN
             sys.tables t ON c.object_id = t.object_id 
        WHERE t.name = 'something'
        

        这是一个 JOIN,您可以使用它来查找常见的列名:

        SELECT * 
        FROM  (SELECT c.name ColumnName
                FROM sys.columns c INNER JOIN
                     sys.tables t ON c.object_id = t.object_id 
                WHERE t.name = 'table1'
              )t1
        JOIN (SELECT c.name ColumnName
                FROM sys.columns c INNER JOIN
                     sys.tables t ON c.object_id = t.object_id 
                WHERE t.name = 'table2'
             )t2
        ON t1.ColumnName = t2.ColumnName
        

        【讨论】:

          【解决方案6】:

          要知道您是否有类似的列可能比其他解决方案建议的更棘手。我们可能会认为两列是相同的,因为它们共享相同的名称,但实际上,当您在一个大型数据库中工作时,有多个人创建、删除和/或更改数据结构时,可能会发生不一致。

          我们检查相似性的参数越多,我们就越能确信我们的列是相似的,而无需手动检查原始数据。

          1.首先,我建议您运行查询以了解给定列的参数。

          SELECT 
              *
          FROM 
              DATABASENAME.INFORMATION_SCHEMA.COLUMNS
          WHERE 
              TABLE_NAME = N'TABLE1'
          

          这将在表中的列上返回几列元数据。一些我发现有趣的独特性元数据包括...

          2. 就我而言,我已经确定了COLUMN_NAME, IS_NULLABLE, AND DATA_TYPE 的列属性以确定我的列是否真正匹配。

          SELECT 
              DISTINCT A.COLUMN_NAME
          FROM INFORMATION_SCHEMA.COLUMNS A
              LEFT join INFORMATION_SCHEMA.COLUMNS B 
                  ON A.COLUMN_NAME = B.COLUMN_NAME 
                  AND A.DATA_TYPE = B.DATA_TYPE
                  AND A.IS_NULLABLE = B.IS_NULLABLE
          WHERE 
              A.TABLE_NAME = N'TABLE1'
              AND B.TABLE_NAME = N'TABLE2'
          

          3. 概念检查...也许当我们JOIN 仅使用COLUMN_NAME 时有10 个匹配列。也许当我们 JOIN 使用 COLUMN_NAME AND DATA_TYPE 时,有 7 个匹配列。也许当我们使用上面示例中的所有三个条件时,有 4 个匹配列。这是否意味着您只能在 4 个匹配的列上加入……绝对不是。它的意思是您需要考虑如何根据您打算如何加入表来制作错误处理和强制转换。重点是在 INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME 上执行 JOIN 时要小心,因为您的结果可能与预期相去甚远。

          【讨论】:

            【解决方案7】:

            使用以下查询(用于显示 coman 列列表的名称)

            select name from syscolumns s1 where id = object_id('table1') and            exists(select 1 from syscolumns s2 where s2.name = s1.name and s2.id = object_id('table2'))
            

            【讨论】:

              【解决方案8】:
              IF OBJECT_ID('tempdb..#Table1') IS NOT NULL DROP TABLE #Table1
              IF OBJECT_ID('tempdb..#Table2') IS NOT NULL DROP TABLE #Table2
              
              
              SELECT      COLUMN_NAME AS 'ColumnName'
                          ,TABLE_NAME AS  'TableName'
              INTO        #Table1
              FROM        INFORMATION_SCHEMA.COLUMNS
              WHERE       TABLE_NAME = 'TABLE_NAME1'
              ORDER BY    TableName
                          ,ColumnName;
              
              SELECT      COLUMN_NAME AS 'ColumnName'
                          ,TABLE_NAME AS  'TableName'
              INTO        #Table2
              FROM        INFORMATION_SCHEMA.COLUMNS
              WHERE       TABLE_NAME = 'TABLE_NAME2'
              ORDER BY    TableName
                          ,ColumnName;
              
              SELECT #Table1.ColumnName
              FROM #Table1
              JOIN #Table2 ON #Table1.ColumnName = #Table2.ColumnName
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-12-18
                • 1970-01-01
                • 2011-01-18
                • 1970-01-01
                相关资源
                最近更新 更多