Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 UPDATE запрос - хелп  [new]
systemio
Member

Откуда:
Сообщений: 33
привет всем,
есть таблица Orders вида:

Id No Color
0 1 Red
1 1 Null
2 1 Null
3 2 Blue
4 2 Null

нужно проапдейтить Color чтобы не было нулов, по след алгоритму: ищем очередной нулл, берем его No и ищем того у кого есть Color (он всегда есть и он всегда один) с таким же No и апдейтим. я сделал такой скрипт

update orders
set orders.color = o3.color
from (select o2.color from orders o2 where o2.no = no and o2.color is not null) as o3
where orders.color is null and no = '1' -- тестируем для no = 1

работает этот скрипт неправильно и не знаю почему, но если в from явно заменить на o2.no = '1' то работает замечательно, понятно что такой вариант не подходит т.к. мне всю таблицу нужно проапдейтить. Помогите кто чем может, или идеи как сдеалть.
13 мар 12, 22:04    [12243064]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE запрос - хелп  [new]
Crimean
Member

Откуда:
Сообщений: 13147
set nocount on

declare @a table( id int , no int , color varchar(10))

insert into @a ( id, no, color )
select 0, 1, 'Red'	union all
select 1, 1, Null	union all
select 2, 1, Null	union all
select 3, 2, 'Blue'	union all
select 4, 2, Null

select * from @a

update a
set color = ( select top 1 color from @a b where b.no = a.no and b.color is not null )
from @a a
where color is null

select * from @a
13 мар 12, 22:12    [12243100]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE запрос - хелп  [new]
Crimean
Member

Откуда:
Сообщений: 13147
ну или как-то так, "моднее"

update a
set a.color = c.color
from @a a
cross apply ( select top 1 b.color from @a b where b.no = a.no and b.color is not null ) as c
where a.color is null
13 мар 12, 22:13    [12243109]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE запрос - хелп  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Ну и вот так еще тогда. если данных много, а индексов мало, то чтобы был Hash Match вместо Nested Loops:

update a
set color = b.color
from @a a
inner join
  (select min(color) color, no from @a b where color is not null group by no) b on a.no = b.no
where a.color is null
14 мар 12, 01:58    [12243747]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить