【问题标题】:INNER JOIN with ON All columns except one ColumnINNER JOIN 与 ON 除一列外的所有列
【发布时间】:2019-01-18 03:02:12
【问题描述】:

我有 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 个表来实现 2 个表的共同点。 但是,这仍然不能满足我的要求,因为我需要为这些常见数据获取 Table1 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

【问题讨论】:

  • 文本请使用文本,而不是图像/链接。请给minimal reproducible example。请阅读How to Ask 和投票箭头鼠标悬停文本。为什么谷歌搜索您的问题的答案没有解决您的问题?
  • 你所有的参数都是int类型的吗?如果是这样,您是否考虑过您是否选择了正确的数据结构从这里开始?从长远来看,使用ID, ParamNumber, ParamValue 的窄表可能更容易使用。
  • 您的查询看起来不错,但没有包含您想要的输出。不太清楚。
  • 嗨 Damien,参数不是 int 类型。它将是 nvarchar。

标签: sql sql-server inner-join intersect


【解决方案1】:

如果我正确理解了您的问题,我想您可以使用以下代码动态生成要使用的查询:

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。使用 @EXCLUDECOLUMNS 参数选择要从 on 子句中排除的列。

【讨论】:

  • 嗨 Sapi,如果表 1 和表 2 位于不同的数据库中怎么办?查询是怎样的?
  • 嘿,要在不同的数据库中选择表,只需在表名前加上 [databaseName].[schema].[tableName] 例如:@TBL1 nvarchar(50) = '[prod].dbo。数据'。现在如果数据库在另一台服务器上,它有点棘手,你将不得不在 sql server 中创建一个链接服务器,但是一旦你这样做,语法是相同的:[serverName].[dbName].[schemaName].[tableName]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
相关资源
最近更新 更多