2011-06-22 51 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 
相關問題