2016-02-01 9 views
1

Я пытаюсь обновить столбец таблицы в SQL Server 2014 на основе значений в другом столбце из той же таблицы. Вот фрагмент таблицы.Обновление столбца в sqlserver на основе значений из другого столбца

CREATE TABLE [dbo].[Table1](
    [id] [int] NULL, 
    [number] [varchar](50) NULL, 
    [fruit] [varchar](50) NULL 

INSERT [dbo].[Table1] ([id], [number], [fruit]) VALUES (1, NULL, N'one') 
INSERT [dbo].[Table1] ([id], [number], [fruit]) VALUES (2, NULL, N'apple') 
INSERT [dbo].[Table1] ([id], [number], [fruit]) VALUES (3, NULL, N'banana') 
INSERT [dbo].[Table1] ([id], [number], [fruit]) VALUES (4, NULL, N'orange') 
INSERT [dbo].[Table1] ([id], [number], [fruit]) VALUES (5, NULL, N'two') 
INSERT [dbo].[Table1] ([id], [number], [fruit]) VALUES (6, NULL, N'apple') 
INSERT [dbo].[Table1] ([id], [number], [fruit]) VALUES (7, NULL, N'banana') 

+----+--------+--------+ 
| id | number | fruit | 
+----+--------+--------+ 
| 1 | NULL | one | 
| 2 | NULL | apple | 
| 3 | NULL | banana | 
| 4 | NULL | orange | 
| 5 | NULL | two | 
| 6 | NULL | apple | 
| 7 | NULL | banana | 
+----+--------+--------+ 

+----+--------+--------+ 
| id | number | fruit | 
+----+--------+--------+ 
| 1 | one | one | 
| 2 | one | apple | 
| 3 | one | banana | 
| 4 | one | orange | 
| 5 | two | two | 
| 6 | two | apple | 
| 7 | two | banana | 
+----+--------+--------+ 

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

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

declare @i varchar 
set @i = 'one' 

while @i = 'one' or @i not in ('apple', 'banana', 'orange') 
begin 
update Table1 
set number = @i 

set @i = fruit 

end 

Но я получаю сообщение об ошибке при попытке установить @ я = фрукты

Любая помощь очень ценится

+0

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

+0

Как и выше, это плохо структурированная система таблиц. Можете ли вы переделать его? Кроме того, в чем цель вставки «одного» и «двух» – Takarii

+0

Добро пожаловать в stackoverflow. +1 для включения ddl + dml для выборочных данных в ваш вопрос. –

ответ

0
declare @tb as TABLE ( [id] [int] NULL, [number] [varchar](50) NULL, [fruit] [varchar](50) NULL) 

INSERT @tb ([id], [number], [fruit]) VALUES (1, NULL, N'one') 
INSERT @tb ([id], [number], [fruit]) VALUES (2, NULL, N'apple') 
INSERT @tb ([id], [number], [fruit]) VALUES (3, NULL, N'banana') 
INSERT @tb ([id], [number], [fruit]) VALUES (4, NULL, N'orange') 
INSERT @tb ([id], [number], [fruit]) VALUES (5, NULL, N'two') 
INSERT @tb ([id], [number], [fruit]) VALUES (6, NULL, N'apple') 
INSERT @tb ([id], [number], [fruit]) VALUES (7, NULL, N'banana') 

select * from @tb 

declare @count int = (select COUNT(*) from @tb) 
declare @cursor int = 1 
declare @updateValue as nvarchar(10) 

While @cursor <= @count 
BEGIN 
set @updateValue = ISNULL((select fruit from @tb where id = @cursor and fruit not in ('apple', 'banana', 'orange')),@updateValue); 
update @tb set number = @updateValue where id = @cursor 
set @cursor = @cursor + 1; 
END 

select * from @tb 

Попробуйте это.

+1

Спасибо, Марко Бонг, который отлично поработал – kabal

0
UPDATE dbo.Table1 
SET number = t.fruit 
FROM (SELECT t1.id, t2.fruit  
     FROM (SELECT id, 
        MAX(CASE WHEN fruit NOT IN ('apple','banana','orange') 
          THEN id ELSE 0 END) 
        OVER (ORDER BY id ROWS UNBOUNDED PRECEDING) AS i 
      FROM dbo.Table1) t1 
     INNER JOIN dbo.Table1 t2 ON t2.id = t1.i) t 
WHERE t.id = dbo.Table1.id; 

Выражение MAX использует новый (SQL Server 2012) windowing functions к паре идентификатор с идентификатором ближе предыдущей строке, не содержащей 'apple', 'banana' или 'orange', то он просто присоединяется к исходной таблице и делает обновление.

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