Перезаписать значения идентификаторов с помощью инструкции UPDATE из SELECT в другой таблице SQL Server 2008 - PullRequest
2 голосов
/ 13 августа 2011

У меня есть две таблицы, в которых ровно 20 строк. Я хочу перезаписать значения идентификаторов в Table2 значениями идентификаторов из Table1, чтобы можно было выполнять тесты с запросами JOIN. Как мне перезаписать значения?

Я нашел сообщения, в которых объясняется, как выполнить ОБНОВЛЕНИЕ, используя инструкцию SELECT, однако для этого требуется объединение данных в столбце, в моем случае ни один столбец не соответствует.

UPDATE Table2
SET Table2.ID = Table1.ID
FROM Table1

Приведенный выше запрос перезаписывает все столбцы идентификаторов в таблице 2 значением первого столбца идентификаторов в таблице 1.

Ответы [ 4 ]

4 голосов
/ 13 августа 2011

Для развлечения (да, у меня извращенное чувство юмора в пятницу вечером!), Вот запрос, который это делает!- Я объявил таблицы и верхнюю часть и использовал только 6 строк в каждой таблице, но вы получите идею:

--Setup test data
declare @table1 table (ID int, Name varchar(10))
declare @table2 table (ID int, Name varchar(10))

insert @table1
    select ID = 1, Name = 'Item1'
    union select ID = 2, Name = 'Item2'
    union select ID = 3, Name = 'Item3'
    union select ID = 4, Name = 'Item4'
    union select ID = 5, Name = 'Item5'
    union select ID = 6, Name = 'Item6'

insert @table2
    select ID = 11, Name = 'Item11'
    union select ID = 12, Name = 'Item12'
    union select ID = 13, Name = 'Item13'
    union select ID = 14, Name = 'Item14'
    union select ID = 15, Name = 'Item15'
    union select ID = 16, Name = 'Item16'


--Do the update
update t1
    set 
        ID = t2.ID
from
    @table1 t1 --Assign a row number to each row of table 1
    cross apply (select rownum = COUNT(1) from @table1 sub where sub.ID <= t1.ID) x1,
    @table2 t2 --Assign a row number to each row of table 2
    cross apply (select rownum = COUNT(1) from @table2 sub where sub.ID <= t2.ID) x2
where x1.rownum = x2.rownum --Match the row numbers

Обновление:

Команда альтернативного обновленияна основании предложения @sllev:

update t1
    set 
        ID = t2.ID
from
    (select id, rownum  = ROW_NUMBER() OVER(order by ID) from @table1) t1
    join (select id, rownum  = ROW_NUMBER() over (order by id) from @table2) t2
        on t1.rownum = t2.rownum
3 голосов
/ 13 августа 2011

И еще одно решение, на этот раз с использованием CTE. Таблица #First получает идентификаторы из таблицы #Second:

CREATE TABLE #First ( ID INT NOT NULL )
INSERT INTO #First VALUES (1), (2), (3), (4), (5)
CREATE TABLE #Second ( ID INT NOT NULL )
INSERT INTO #Second VALUES (6), (7), (8), (9), (10)
GO

WITH first AS (SELECT ID, ROW_NUMBER() OVER (ORDER BY ID) AS RowNum FROM #First)
   , second AS (SELECT ID, ROW_NUMBER() OVER (ORDER BY ID) AS RowNum FROM #Second)
UPDATE #First
SET ID = s.ID
FROM second s
JOIN first f ON s.RowNum = f.RowNum
WHERE #First.ID = f.ID

SELECT * FROM #First

DROP TABLE #First;
DROP TABLE #Second;
1 голос
/ 13 августа 2011

Как указано в комментариях, если это единовременное тестирование, самый простой вариант для всего 20 строк - открыть Table2 в SSMS и ввести значения идентификаторов в.

1 голос
/ 13 августа 2011

Поскольку у вас есть только 20 строк, я бы вручную обновил их, введя ваши изменения. Тем более что записи не соотносятся друг с другом, как это обычно бывает при обновлении с выбором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...