INNER JOIN с ON Все столбцы, кроме одного столбца

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

Таблица1 и Таблица2

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

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?

Удаление столбца идентификатора из обеих таблиц и выполнение пересечения также невозможно, поскольку я все еще хочу извлечь идентификатор таблицы 1 для другой цели. Я могу добиться общего из 2 таблиц, удалив идентификатор и сравнив эти 2 таблицы. Однако это по-прежнему не соответствует моему требованию, поскольку мне нужно получить идентификатор таблицы 1 для этих общих данных.

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

person Swe Zin Hsu Kyi    schedule 18.01.2019    source источник
comment
Пожалуйста, используйте для текста текст, а не изображения/ссылки. Приведите минимально воспроизводимый пример. Пожалуйста, прочитайте Как задать вопрос и наведите указатель мыши на текст со стрелкой голосования. Почему ответы из Google на ваш вопрос не решили вашу проблему?   -  person philipxy    schedule 18.01.2019
comment
Возможный дубликат Выбрать все столбцы, кроме одного, в MySQL?   -  person philipxy    schedule 18.01.2019
comment
Все ваши параметры имеют тип int? Если да, то подумали ли вы о том, правильную ли структуру данных вы выбрали для начала? Узкая таблица с ID, ParamNumber, ParamValue может быть намного проще для работы в долгосрочной перспективе.   -  person Damien_The_Unbeliever    schedule 18.01.2019
comment
Ваш запрос выглядит хорошо, но вы не включили нужный результат. Это не слишком ясно.   -  person Vijunav Vastivch    schedule 18.01.2019
comment
Привет, Дэмиен, параметры не являются типом int. Это будет nvarchar.   -  person Swe Zin Hsu Kyi    schedule 18.01.2019
comment
Привет, филиппи, здесь я пытаюсь получить набор общих параметров для таблицы 1 и таблицы 2.   -  person Swe Zin Hsu Kyi    schedule 18.01.2019
comment
Привет, Виджунав, я хотел бы сравнить 2 таблицы. Эти две таблицы могут иметь одинаковые значения для всех столбцов, кроме идентификатора. Я хочу получить значения общих параметров среди этих двух таблиц, но ID для ссылки на идентификатор Table1.   -  person Swe Zin Hsu Kyi    schedule 18.01.2019
comment
Что не так с вводом всех имен столбцов?   -  person Salman A    schedule 18.01.2019


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

person sapi    schedule 18.01.2019
comment
Привет, Сапи, что, если таблица 1 и таблица 2 находятся в разных базах данных? Как выглядит запрос? - person Swe Zin Hsu Kyi; 21.01.2019
comment
эй, чтобы выбрать таблицы в другой базе данных, просто добавьте к имени таблицы префикс [databaseName].[schema].[tableName] ex : @TBL1 nvarchar(50) = '[prod].dbo.data'. Теперь, если в базе данных на другом сервере это немного сложнее, вам придется создать связанный сервер на сервере sql, но как только вы это сделаете, синтаксис идентичен: [serverName].[dbName].[schemaName].[tableName] - person sapi; 21.01.2019