簡體   English   中英

帶ON的INNER JOIN除一列外的所有列

[英]INNER JOIN with ON All columns except one Column

我有2個表(表1和表2)。 這兩個表架構完全相同,並且都可能具有重復的記錄集,但ID除外,因為ID是自動生成的。

表1和表2

我想獲取一組通用的記錄,但要使用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

如果我正確理解了您的問題,我想您可以使用以下代碼動態生成要使用的查詢:

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子句中排除的列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM