SQL在不同的表中查找相同的列

时间:2011-06-22 19:45:05

标签: sql join compare union

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

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

我使用MS Sql server。

任何一个都没有约束,也没有外键。

我该怎么做?

这样的事情:

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

提前致谢。

5 个答案:

答案 0 :(得分:8)

如果您要查找两个表之间相同的列名,则应该可以使用:

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来确保它们是相同的类型。

答案 1 :(得分:1)

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

如果您有要用于比较的列(示例中为Table1.YourColumnTable2.OtherColumn),则可以执行以下操作:

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

答案 2 :(得分:0)

这是一个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

答案 3 :(得分:0)

假设您的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

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

答案 4 :(得分:0)

    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