Запись обновления T-SQL с другого номера строки - PullRequest
0 голосов
/ 13 декабря 2010

В SQL Server 2008 у меня есть таблица1, и я хотел бы обновить таблицу, как показано во второй таблице.т.е. обновить обновление Value1 of Rn (2) = Value2 of Rn (1) из записи выше.Последовательность определяется Rn.Любая помощь в этом отношении будет оценена.

alt text

Большое спасибо.

Create table Table1(ID int, value1 int, value2 int, Item varchar(10),Rn int)

insert into Table1(ID,Value2,Item,Rn) values('1','33242','Orange','1')
insert into Table1(ID,Value2,Item,Rn) values('2','67665','Orange','2')
insert into Table1(ID,Value2,Item,Rn) values('3','78765','Orange','3')
insert into Table1(ID,Value2,Item,Rn) values('4','576','Orange','4')
insert into Table1(ID,Value2,Item,Rn) values('5','906658','Orange','5')
insert into Table1(ID,Value2,Item,Rn) values('6','54435','Orange','6')
insert into Table1(ID,Value2,Item,Rn) values('7','7464','Mango','1')
insert into Table1(ID,Value2,Item,Rn) values('8','9876','Mango','2')
insert into Table1(ID,Value2,Item,Rn) values('9','2433','Mango','3')
insert into Table1(ID,Value2,Item,Rn) values('10','5654','Mango','4')
insert into Table1(ID,Value2,Item,Rn) values('11','13213','Mango','5')
insert into Table1(ID,Value2,Item,Rn) values('12','9867867','Mango','6')
insert into Table1(ID,Value2,Item,Rn) values('13','5644355','Mango','7')
insert into Table1(ID,Value2,Item,Rn) values('14','6534','Apple','1')
insert into Table1(ID,Value2,Item,Rn) values('15','343','Apple','2')
insert into Table1(ID,Value2,Item,Rn) values('16','423','Apple','3')
insert into Table1(ID,Value2,Item,Rn) values('17','7666','Apple','4')

Ответы [ 4 ]

2 голосов
/ 14 декабря 2010

Устанавливает значение 1 первой строки каждого «блока» в ноль.Вы можете использовать ISNULL, чтобы переопределить это и сделать его 0, или любое другое значение по умолчанию, которое может быть подходящим.

;WITH cte (Id, Value1, Value2, Item, Rn, RnPlus1)
 as (select Id, Value1, Value2, Item, Rn, row_number() over (partition by Item order by Rn) + 1 RnPlus1
 from Table1) 
UPDATE Table1
 set Value1 = cte.Value2
 from Table1 t1
  inner join cte
   on cte.Item = t1.Item
    and cte.RnPlus1 = t1.Rn
0 голосов
/ 13 декабря 2010

Я всегда считал, что это правильная боль в заднице. Но я бы предложил курсор. Что-то вроде этого; (Это просто скелет. Он не работает! Но вы должны увидеть принцип)

DECLARE @ field1 integer ОБЪЯВИТЬ @ fiedl2 целое число ОБЪЯВИТЬ @NewValue integer

SET @NewValue = 0

ОБЪЯВИТЬ Tab1 CURSOR FOR SELECT * FROM Table1

FETCH NEXT FROM Tab1 INTO @ field1, @ field2

WHILE @@ FETCH_STATUS = 0 НАЧАТЬ

IF @NewValue <> 0
    UPDATE Table1 SET field1 = @NewValue

FETCH NEXT FROM Tab1
INTO @field1, @field2

SET @NewValue = @field2

END

ЗАКРЫТЬ Tab1 DEALLOCATE Tab1

0 голосов
/ 13 декабря 2010

Вне моей головы, что-то вроде:

обновление таблицы1 t1 set t1.value1 = (выберите t2.value2 из таблицы1 t2, где t2.id = t1.id + 1) где t1.rn! = 1

0 голосов
/ 13 декабря 2010

Может быть сложно, так как вы не определили никаких родительских дочерних отношений. Можете ли вы просто сделать это во время вставки (и, возможно, затем определить отношение ...)?

insert into Table1(ID,Value1,Value2,Item,Rn) values('1','','33242','Orange','1')
insert into Table1(ID,Value1,Value2,Item,Rn) values('2','33242','67665','Orange','2')
insert into Table1(ID,Value1,Value2,Item,Rn) values('3','67665','78765','Orange','3')
insert into Table1(ID,Value1,Value2,Item,Rn) values('4','78765','576','Orange','4')

и так далее ...

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