【问题标题】:SQL find the same column in different tablesSQL在不同表中查找同一列
【发布时间】:2011-09-20 16:40:30
【问题描述】:

我有 2 张非常大的桌子。我试图找出它们的共同点。

它们的列数不同。我可以只查看每个表中的每个列名并进行比较 - 但它们都有数百列(我必须为许多这样的表这样做)。

我使用 MS Sql 服务器。

其中没有任何约束,也没有外键。

我该怎么做呢?

类似这样的:

select * AS "RES" from Table1 where RES IN (select * column from Table2)

提前致谢。

【问题讨论】:

  • 什么关系型数据库?您将需要查询不同数据库系统之间不同的元数据。
  • 你的意思是他们有类似的列/字段?为什么不直接检查表定义并找出其中的相似之处?
  • 您是在谈论比较这些表中的数据还是在谈论比较表的签名?
  • 在不知道什么数据库以及您想要比较什么的情况下,这不是一个可以回答的问题,很可能会被关闭。请编辑并提供更多信息。

标签: sql join compare union


【解决方案1】:

如果您正在寻找两个表之间相同的列名,这应该可以:

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

您还可以通过在子查询中输入和 sc1.xtype = sc2.xtype 来确保它们是相同的类型。

【讨论】:

  • 这是否适用于 Oracle、MySQL、DB2 和所有其他 RDBMS 以及 SQL Server?不知道是什么数据库,怎么能说这是答案呢?
  • 该问题提到了 SQL Server,因此仅适用于 SQL Server 的答案就足够了。当涉及到这样的事情时,我不希望有足够通用的东西可以在每个系统上工作。这在 SQL Server 上对我有用,对此投了赞成票。
【解决方案2】:

如果我理解正确,您是在尝试比较两个表中的数据并检查数据的共同点。

如果您有要用于比较的列(在示例中为Table1.YourColumnTable2.OtherColumn),您可以这样做:

select YourColumn from Table1 t1
where exists (select OtherColumn 
              from Table2 t2 
              where t2.OtherColumn = t1.YourColumn)

【讨论】:

    【解决方案3】:
        DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX),    @Table1 AS NVARCHAR(MAX)='Table1'    , @Table2 AS NVARCHAR(MAX)='Table2'
    
    select @cols = STUFF((SELECT distinct ',' + QUOTENAME(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  and A.COLUMN_NAME not in ('Doc','CreatedBy')
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    set @query = 'SELECT ' + @cols + ' 
                from 
                (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+''' 
    
                ) x
                pivot 
                (
                    Max(COLUMN_NAME)
                    for COLUMN_NAME in (' + @cols + ')
                ) p '
    
    execute sp_executesql @query
    

    【讨论】:

      【解决方案4】:

      这是一个SP,用于在两个不同的表中查找公共列..

      在 SQL Server 中工作

      SET ANSI_NULLS ON
      GO
      SET QUOTED_IDENTIFIER ON
      GO
      CREATE PROCEDURE GetColumnsData(@T_NAME1 varchar,@T_NAME2 varchar)
      AS
      BEGIN
      DECLARE @Co int;
      SET @co = 0;
      CREATE TABLE #TEMP_TABLE(C_NAME VARCHAR(50),D_TYPE VARCHAR(50),T_NAME VARCHAR(50));
      INSERT INTO #TEMP_TABLE (C_NAME,D_TYPE,T_NAME)( SELECT COLUMN_NAME,DATA_TYPE,
      TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @T_NAME1 OR
       TABLE_NAME= @T_NAME2);
      SELECT @Co = COUNT(*) from #TEMP_TABLE t , #TEMP_TABLE t1 WHERE t1.C_NAME = t.C_NAME
       and t.D_TYPE = t1.D_TYPE and t.T_NAME != t1.T_NAME
      PRINT @co
      END
      

      【讨论】:

        【解决方案5】:

        假设您的 RDBMS 支持摘要,您可以计算每行的摘要并加入摘要。比如:

        SELECT T1.*
        FROM
            (SELECT *, MD5(col1, col2,...) as digest
             FROM Table1) T1,
            (SELECT *, MD5(col1, col2,...) as digest
             FROM Table2) T2
        WHERE T1.digest = T2.digest
        

        我假设这两个表具有相同的列和列类型。

        【讨论】:

        • 我是新手,所以我不确定我是否应该自己编辑它,但你有两个 T1,其中一个应该是 T2。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 2020-04-10
        • 2014-12-27
        • 2012-09-03
        • 1970-01-01
        相关资源
        最近更新 更多