我有2个非常大的表。我试图弄清楚他们有什么共同之处。SQL在不同的表中找到相同的列
它们没有相同数量的列。我可以去查看每个表中的每个列名并进行比较 - 但它们都有数百个列(我必须为许多这样的表执行)。
我使用MS Sql服务器。
在它们中没有任何约束和没有外键。
我该如何去做呢?
事情是这样的:
select * AS "RES" from Table1 where RES IN (select * column from Table2)
在此先感谢。
我有2个非常大的表。我试图弄清楚他们有什么共同之处。SQL在不同的表中找到相同的列
它们没有相同数量的列。我可以去查看每个表中的每个列名并进行比较 - 但它们都有数百个列(我必须为许多这样的表执行)。
我使用MS Sql服务器。
在它们中没有任何约束和没有外键。
我该如何去做呢?
事情是这样的:
select * AS "RES" from Table1 where RES IN (select * column from Table2)
在此先感谢。
如果你正在寻找这是两个表之间的相同,这应该を列名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子查询是同一类型。
这是否适用于Oracle,MySQL,DB2和所有其他RDBMS以及SQL Server?不知道什么数据库,你怎么能说这是一个答案? –
这个问题提到了SQL Server,因此仅适用于SQL Server的答案就足够了。当涉及到这样的事情时,我不会期望有足够通用的东西来处理每个系统。这在SQL Server上为我工作,为此投了赞成票。 – joshhendo
如果我理解正确,您试图比较两个表中的数据并检查数据的共同点。
前提是你必须要使用比较(Table1.YourColumn
和Table2.OtherColumn
,在本例中)的列,你可以这样做:
select YourColumn from Table1 t1
where exists (select OtherColumn
from Table2 t2
where t2.OtherColumn = t1.YourColumn)
这里是要找到在两个不同的表共同列的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
假设您的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。 –
嘿,谢谢。固定。 – Jason
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
什么RDBMS?您将需要查询各种数据库系统之间的元数据。 – JNK
你的意思是他们有类似的栏目?你为什么不检查表格定义并找出它们之间的相似之处? – Rahul
你是在谈论比较这些表中的数据还是你在谈论比较表的签名? –