Как обновить таблицу на основе индекса строки? - PullRequest
3 голосов
/ 06 января 2012

Я сделал копию существующей таблицы следующим образом:

select * into table_copy from table

С тех пор я внес некоторые изменения в схему таблицы (добавлены / удалены столбцы, изменен порядок столбцов и т. Д.). Теперь мне нужно запустить оператор обновления, чтобы заполнить новый столбец, который я добавил следующим образом:

update t
set t.SomeNewColumn = copy.SomeOldColumn
from t

Однако как мне получить вторую таблицу здесь, основанную на индексе строки, а не на совпадении некоторого значения столбца?

Примечание. Обе таблицы по-прежнему имеют одинаковое количество строк в исходных позициях.

Ответы [ 4 ]

3 голосов
/ 06 января 2012

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

Если у ваших таблиц нет первичного ключа, вам необходимоопределить один.

3 голосов
/ 06 января 2012

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

update t set
    t.SomeNewColumn = copy.SomeOldColumn
from
    table t
    inner join table_copy copy on
        t.id = copy.id

Если у вас нет возможности однозначно идентифицировать строку и вы полагаетесь на порядок строк, вам не повезло, поскольку порядок строк ненадежен ни в одной версии SQL Server (как и в большинстве других РСУБД).

2 голосов
/ 06 января 2012

Вы можете использовать это, чтобы обновить их, сопоставив идентификаторы

UPDATE
    t
SET
    t.SomeNewColumn = other_table.SomeOldColumn,
FROM
    original_table t
INNER JOIN
     other_table copy
ON
    t.id = copy.id

или, если у вас нет идентификаторов, вы можете что-то извлечь, используя функцию ROW_NUMBER для перечисления записей, но это далеко (я не проверял, возможно ли это) .

0 голосов
/ 21 марта 2015

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

UPDATE t SET t.SomeNewColumn = copy.SomeOldColumn
FROM table t
    JOIN (SELECT ROW_NUMBER() OVER(ORDER BY id) AS row, id, SomeNewColumn FROM table) t2
        ON t2.Id = t.Id
    JOIN (SELECT ROW_NUMBER() OVER(ORDER BY id) AS row, SomeOldColumn FROM copytable) copy
        ON copy.row = t2.row

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

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