2010-04-26 11 views
0

я получил таблицу, которая содержит 5 столбцов и запросов требования:Создание запроса на обновление SQL на основе нескольких столбцов и записей в одной таблице

update row no 8 (or id=8) set its column 2, column 3's value 
      from id 9th column 2, column 3 value. 

означает, что все значения столбца 2, 3 следует перенести в колонну 2, 3 верхней строки (начиная с строки № 8), а значение последней строки 2, 3 будет пустым.

Например, только с тремя строками первая строка является нетронутой, вторая - N-1 -го строки сдвигаются один раз, а строка N th имеет значения NULL.

id math science sst hindi english 
    1 11  12  13 14 15 
    2 21  22  23 24 25 
    3 31  32  33 34 35 

Результат запроса ид = 2 должно быть:

id math science sst hindi english 
    1 11  12  13 14 15 
    2 31  32  23 24 25  //value of 3rd row (col 2,3) shifted to row 2 
    3 null null 33 34 35 

Этот процесс должен работать для всех рядов, идентификатор> 2

Пожалуйста, помогите мне создать этот запрос на обновление

Я использую MS sqlserver 2005

+0

Какую базу данных вы используете (MySQL, SQL Server, Oracle, ...)? –

+0

ms sqlserver 2005 –

+0

@Peter: учитывая прозвище Rajesh '.Net Developer', я бы рискнул предположить, что он использует MS SQL Server. –

ответ

2

Я ДУМАЮ, что вы ищете, это что-то вроде ...

UPDATE t1 
    SET 
     t1.math = t2.math, 
     t1.science = t2.science, 
     etc... 
    FROM 
     YourTable t1, 
     YourTable t2 
    WHERE 
     t1.id+1 = t2.id 

Обратите внимание на то, что для Идентификатора таблицы первого экземпляра, где ID первого экземпляра равен ID, равен ID во втором экземпляре. Поэтому, если в таблице 1 ID = 8, он будет присоединяться к ID второго экземпляра. 9. В конце, если только 10 записей, 10 + 1 не будут иметь совпадения и, следовательно, приведут к NULL.

+0

gr8, большое спасибо ИТ-специалистам, которые мне нужны, только один не работает, что последняя строка не получает нулевое значение в своем столбце, значение которого переместилось в верхнюю строку. –

+0

Затем я бы добавил вторую команду обновления, чтобы установить все столбцы без идентификатора равными нулю, где t1.ID = select max (t2.id) из YourTable t2 – DRapp

1

Как насчет:

-- @StartAt is the "first" (lowest Id) row to be updated 
UPDATE MyTable 
set 
    math = mt2.math 
    ,science = mt2.sceience 
from MyTable mt 
    left outer join MyTable mt2 
    on mt2.Id = mt.Id + 1 
where mt.Id >= @StartAt 

В вашем примере, набор @StartAt до 2. В строке «последний» получает значение нулям через левое внешнее соединение никогда не находя строку, чтобы присоединиться к. (Это предполагает, что все последовательные строки найдены. Если вам не хватало строки, набор NULL будет «прокрадываться» и перезаписывать некоторые реальные данные ...)

+0

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

+0

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

+0

Во-вторых, поскольку ваше обновление полностью зависит от данных, которые точно заказываются (сначала заменяются вторым, вторым - третьим и т. Д.), Вам нужно идентифицировать это упорядочение и как-то работать в предложении join (mt.YourId = mt2.YourId + 1). Я бы посмотрел на функцию ранжирования row_number() для этого, но это полностью зависит от того, как вы определяете порядок данных. –

0

Вы можете сделать это с помощью «Обновить» и «Присоединиться».

UPDATE TempTable2 
SET math=T2.Math, 
science=T2.science, 
sst=T2.sst, 
hindi=T2.hindi, 
english=T2.english 
FROM TempTable2 T 
    LEFT JOIN 
    (SELECT id -1 as ID, math, science, sst, hindi, english 
    FROM temptable2) T2 
    ON T.ID=T2.Id 
WHERE T.id>2 
Смежные вопросы