我有2个表(表1和表2)。这两个表架构完全相同,而且由于ID是自动生成的,因此它们都可能具有重复的记录集(除了ID)。
我想获取一组通用的记录,但要使用ID作为Table1的ID。因此,我使用内部联接进行查询。它按我的预期工作。
SELECT Table1.ID, Table1.Param1, Table1.Param2, Table1.Param3
INTO #Common
FROM Table1
INNER JOIN Table2 ON Table1.Param1 = Table2.Param1
AND Table1.Param2 = Table2.Param2
AND Table1.Param3 = Table2.Param3
但是,在实际使用中,两个表中的参数总数将约为100。因此,ON子句中的比较总数将增加至100。 如何通过排除一列而不是比较ON子句中的所有列来进行内部联接?
通过从两个表中删除ID列并进行相交也是不可能的,因为我仍然想提取Table1 ID用于其他目的。 我可以通过删除ID并比较这两个表来实现2表的共同点。 但是,这仍然不能满足我的要求,因为我需要获取这些常见数据的表1 ID。
SELECT * INTO #TemporaryTable1 FROM Table1
ALTER TABLE #TemporaryTable1 DROP COLUMN ID
SELECT * INTO #TemporaryTable2 FROM Table2
ALTER TABLE #TemporaryTable2 DROP COLUMN ID
SELECT * INTO #Common FROM (SELECT * FROM #TemporaryTable1 INTERSECT SELECT * FROM #TemporaryTable2) data
SELECT * FROM #Common
答案 0 :(得分:2)
如果我正确理解了您的问题,我想您可以使用以下代码动态生成您要使用的查询:
DECLARE @SQL nvarchar(max) = 'SELECT ',
@TBL1 nvarchar(50) = 'data',
@TBL2 nvarchar(50) = 'data1',
@EXCLUDEDCOLUMNS nvarchar(100)= 'ID,col1'
-- column selection
SELECT @sql += @tbl1 + '.' + COLUMN_NAME + ' ,
'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TBL1
-- from clause and remove last ,
set @SQL = LEFT(@sql,LEN(@sql) - 5)
SET @sql += '
FROM ' + @TBL1 + ' INNER JOIN
' + @TBL2 + '
ON '
-- define the on clause
SELECt @SQL += @tbl1 + '.' + COLUMN_NAME + ' = '+ @tbl2 + '.' + COLUMN_NAME +',
'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TBL1
AND COLUMN_NAME not in (@EXCLUDEDCOLUMNS)
--remove last ,
set @SQL = LEFT(@sql,LEN(@sql) - 3)
--SELECt @SQL
EXEC SP_EXECUTESQL @sql
在执行之前,请确保正确生成@sql。使用@EXCLUDEDCOLUMNS参数选择要从on子句中排除的列。