ВНУТРЕННЕЕ СОЕДИНЕНИЕ с ВКЛ. Все столбцы, кроме одного столбца - PullRequest
0 голосов
/ 18 января 2019

У меня есть 2 таблицы (Таблица1 и Таблица2). Схемы обеих таблиц абсолютно одинаковы, и обе могут иметь дублированный набор записей, кроме идентификаторов, поскольку идентификатор генерируется автоматически.

Table1 and Table2

Я хотел бы получить общий набор записей, но с идентификатором, который следует за идентификатором Таблицы1. Итак, я запрашиваю, используя Inner join. Это работает, как я ожидал.

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 для других целей. Я могу достичь общего 2 таблицы, удалив ID и сравнить эти 2 таблицы. Однако это по-прежнему не отвечает моим требованиям, поскольку мне необходимо получить идентификатор Table1 для этих общих данных.

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

1 Ответ

0 голосов
/ 18 января 2019

Если я правильно понял вашу проблему, думаю, вы могли бы динамически генерировать запрос, который вы хотите использовать, используя следующий код:

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 сформирован правильно. выберите столбцы, которые вы хотите исключить из предложения on, используя параметр @EXCLUDEDCOLUMNS.

...