我有2张非常大的桌子。我试图找出它们的共同点。
它们没有相同数量的列。我可以只查看每个表中的每个列名并进行比较 - 但它们都有数百列(我必须为许多这样的表执行此操作)。
我使用MS Sql server。
任何一个都没有约束,也没有外键。
我该怎么做?
这样的事情:
select * AS "RES" from Table1 where RES IN (select * column from Table2)
提前致谢。
答案 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.YourColumn
和Table2.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