2012-01-05 9 views
2

Я сделал копию существующей таблицы, как это:Как обновить таблицу на основе индекса строки?

select * into table_copy from table 

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

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

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

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

+0

Ваш вопрос непонятен. Что вы подразумеваете под «как мне получить вторую таблицу здесь»? – Shraddha

+0

@ Шраддха - Извините, что это было очевидно. Обычно для соединения таблицы с таблицей table_copy следует использовать оператор join или select. –

+0

В таблице SQL Server отсутствует ** номер строки ** или ** индекс строки **. Вы должны иметь действительный первичный ключ и сравнивать строки из двух таблиц на основе их первичного ключа - это способ сделать это в SQL! –

ответ

3

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

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

+0

Почему? Я надеялся, что это не так. –

+0

@ subt13 - Потому что номер строки не является надежным в SQL Server (или любой РСУБД, действительно). Строки постоянно перемещаются физически, чтобы оптимизировать их. Тот же запрос 'select * from table' может производить 20 разных порядков для 20 различных исполнений. У меня была таблица перед тем, как перенести две строки между казнями. Индекс строк, просто, не является надежным и нет (легкого) механизма для вас присоединиться к нему по уважительной причине. – Eric

+2

@ subt13 - Порядок данных таблицы не может быть гарантирован, если вы не укажете в запросе предложение ORDER BY. Хотя может показаться, что ваши данные возвращаются в том же порядке, что не всегда может быть правдой. Взгляните на этот ответ на другой вопрос о SO: http: // stackoverflow.com/a/2040833/243925 – Tony

3

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

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

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

+1

+1 для нормального способа сделать это –

2

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

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

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

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 

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

Смежные вопросы