Eu tenho 2 tabelas (Tabela1 e Tabela2). O esquema de ambas as tabelas é exatamente o mesmo e ambos podem ter um conjunto de registros duplicado, exceto IDs, pois o ID é gerado automaticamente.
Eu gostaria de obter o conjunto comum de registros, mas com ID a seguir como ID da Tabela1. Então, eu procuro usando o Inner join. Funciona como eu esperava.
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
No entanto, no uso real, o número total de parâmetros em ambas as tabelas será em torno de 100. Portanto, o número total de comparação dentro da cláusula ON aumentará para 100. Como posso fazer junção interna excluindo uma coluna em vez de comparar todas as colunas na cláusula ON?
Ao remover a coluna ID de ambas as tabelas e fazer a interseção também não é possível, pois ainda quero extrair a ID da Tabela1 para outro propósito. Posso alcançar o comum de 2 tabelas removendo ID e comparando essas 2 tabelas. No entanto, isso ainda não atende ao meu requisito, já que preciso obter a ID da Tabela 1 para esses dados comuns.
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
Se entendi seu problema corretamente, acho que você poderia gerar dinamicamente a consulta que deseja usar usando o seguinte código:
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
Antes de executar, certifique-se de que @sql foi gerado corretamente. escolha as colunas que deseja excluir de sua cláusula on usando o parâmetro @EXCLUDEDCOLUMNS.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras