Создание запроса на обновление SQL на основе нескольких столбцов и записей в одной таблице - PullRequest
0 голосов
/ 26 апреля 2010

У меня есть таблица, которая содержит 5 столбцов и требования запроса:

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 последней строки будет нулевым

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

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

Результат запроса id = 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

Ответы [ 3 ]

2 голосов
/ 26 апреля 2010

Я думаю, что вы ищете что-то вроде ...

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

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

1 голос
/ 26 апреля 2010

Как насчет:

--  @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 голосов
/ 26 апреля 2010

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

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
...