Определите строки, которые идентичны в 2 разных таблицах - PullRequest
1 голос
/ 26 марта 2012

У меня есть 2 таблицы с одной и той же схемой (одна является временной)

Временная таблица и основная таблица будут иметь несколько одинаковых строк.

Мне нужно ОБНОВИТЬ основную таблицу длякоторый, та же самая запись существует на искушаемом.

Как лучше всего это сделать.

Таблицы содержат более 100 столбцов.Так можно ли это сделать без перечисления всех столбцов в запросе?

Большое спасибо

Ответы [ 4 ]

3 голосов
/ 26 марта 2012

Вам нужно использовать оператор MERGE. Хорошее руководство для этого в http://technet.microsoft.com/en-us/library/bb522522.aspx

Теперь, что касается перечисления столбцов, просто используйте уникальный ключ, чтобы выяснить, являются ли строки общими или нет.

2 голосов
/ 26 марта 2012

Вы можете построить запрос динамически.Я не думаю, что это особенно изящное решение, но оно бы сработало:

DECLARE @TableName VARCHAR(100),
        @FlagColumn VARCHAR(100)

SET @TableName = 'TestTable'
SET @FlagColumn = 'FlagColumn'
-- BUILD THE TEMPORARY TABLE
DECLARE @SQL VARCHAR(MAX)
SET @SQL = 'SELECT * INTO ##' + @TableName + ' FROM ' + @TableName
EXEC(@SQL)

-- DO STUFF

-- BUILD SQL FOR MERGE STATEMENT
SET @SQL = ''
SELECT  @SQL = @SQL + ' AND main.' + COLUMN_NAME + ' = temp.' + COLUMN_NAME
FROM    INFORMATION_SCHEMA.COLUMNS
WHERE   TABLE_NAME = @TableName
AND     COLUMN_NAME != @FlagColumn

SET @SQL = 'MERGE INTO ' + @TableName + ' main USING ##' + @TableName + ' temp ON ' + STUFF(@SQL, 1, 5, '') + 
            ' WHEN MATCHED THEN UPDATE SET ' + @FlagColumn + ' = 1;'
-- EXECUTE MERGE STATEMENT
EXEC (@SQL)

-- DROP TEMP TABLE
SET @SQL = 'DROP TABLE ##' + @TableName
EXEC (@SQL)

Это более динамично, чем необходимо, и его можно упростить, поскольку ни один из временных элементов таблицы не должен выполняться динамическиЯ только что сделал это, потому что я не знаю имен вашей таблицы или имени вашей временной таблицы.

Я проверил это, создав следующую таблицу:

CREATE TABLE TestTable (FlagColumn BIT)
DECLARE @i INT = 1
DECLARE @SQL VARCHAR(MAX)
WHILE @i < 100
    BEGIN
        SET @SQL = 'ALTER TABLE TestTable ADD COLUMN' + CONVERT(VARCHAR, @i) + ' INT'
        EXEC (@SQL)
        SET @i = @i + 1
    END
1 голос
/ 26 марта 2012

Возможно, вы ищете Пересечь .Запрос:

select *
from TableA
intersect
select * 
from TableB

извлекает строки, найденные в обоих наборах.

Что касается вопроса из ста столбцов, откройте Sql Server Management Studio, найдите таблицу в таблицах, щелкните правой кнопкой мыши и выберите «СценарийТаблица как ", затем" Вставить в ", затем" Новое окно запроса ", чтобы получить список столбцов через запятую.

1 голос
/ 26 марта 2012
update MyTable set
  ColumnX = ?? /* Update the columns your require to the new values */
  , ColumnY = ??
from MyTable, MyTempTable T
where MyTable.ColumnA = T.ColumnA
and MyTable.ColumnB = T.ColumnB
/* Add as many conditions as necessary to be a match */

если столбец может быть нулевым, вы должны обрабатывать это как:

where ((MyTable.ColumnA is null and T.ColumnA isn null) or MyTable.ColumnA = T.ColumnA)

или если вы знаете, что определенное значение недопустимо, поскольку 0 находится в столбце идентификации, который вы можете сделать

where isnull(MyTable.ColumnA,0) = isnull(T.ColumnA,0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...