2011-06-22 50 views
0

我有2个非常大的表。我试图弄清楚他们有什么共同之处。SQL在不同的表中找到相同的列

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

我使用MS Sql服务器。

在它们中没有任何约束和没有外键。

我该如何去做呢?

事情是这样的:

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

在此先感谢。

+1

什么RDBMS?您将需要查询各种数据库系统之间的元数据。 – JNK

+0

你的意思是他们有类似的栏目?你为什么不检查表格定义并找出它们之间的相似之处? – Rahul

+1

你是在谈论比较这些表中的数据还是你在谈论比较表的签名? –

回答

8

如果你正在寻找这是两个表之间的相同,这应该を列名RK:

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子查询是同一类型。

+0

这是否适用于Oracle,MySQL,DB2和所有其他RDBMS以及SQL Server?不知道什么数据库,你怎么能说这是一个答案? –

+0

这个问题提到了SQL Server,因此仅适用于SQL Server的答案就足够了。当涉及到这样的事情时,我不会期望有足够通用的东西来处理每个系统。这在SQL Server上为我工作,为此投了赞成票。 – joshhendo

1

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

前提是你必须要使用比较(Table1.YourColumnTable2.OtherColumn,在本例中)的列,你可以这样做:

select YourColumn from Table1 t1 
where exists (select OtherColumn 
       from Table2 t2 
       where t2.OtherColumn = t1.YourColumn) 
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 
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 

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

+0

我是新来的,所以我不确定我是否应该自己编辑它,但是你有两个T1,其中一个应该是T2。 –

+0

嘿,谢谢。固定。 – Jason

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 = '''[email protected]+''' 
       and B.TABLE_NAME = '''[email protected]+''' 

      ) x 
      pivot 
      (
       Max(COLUMN_NAME) 
       for COLUMN_NAME in (' + @cols + ') 
      ) p ' 

execute sp_executesql @query 
相关问题