Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подскажите с апдейтом  [new]
sts7865
Guest
Привет всем.
Есть табличка такой вот структуры:
Declare @t table (id int primary key, val int, id1 int, id2 int);
INSERT @t VALUES 
(1, 1000, 0, 0), 
(2, 2000, 0, 0), 
(3, 3000, 0, 0), 

(14, 100, 1, 2), 
(15, 300, 2, 3), 
(16, 500, 1, 3);
id - ключ
val - значение
id1 - значение ключа первой "родительской" записи
id2 - значение ключа второй "родительской" записи
Мне надо посчитать значения "родительских" записей путем вычитания из них значений "дочерних"
т.е. получить результат:
(1, 400, 0, 0), -- 1000-100-500
(2, 1600, 0, 0),  -- 2000-100-300
(3, 2200, 0, 0),  -- 3000-300-500
...

Что-то не соображу можно ли тут одним UPDATE обойтись
Спасибо за советы
13 июн 13, 13:32    [14427957]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с апдейтом  [new]
Гость333
Member

Откуда:
Сообщений: 3683
sts7865,

Например, так
update t
set    val = t.val - isnull((select sum(t1.val) from @t t1 where t1.id1 = t.id), 0) - isnull((select sum(t2.val) from @t t2 where t2.id2 = t.id), 0)
from   @t t; 
13 июн 13, 14:33    [14428467]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с апдейтом  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Или так
update t
set    val = tmp.new_val
from   @t t
       inner join
       (
          select   t.id, t.val - isnull(sum(t1.val), 0) - isnull(sum(t2.val), 0) as new_val
          from     @t t
                   left outer join @t t1 on t1.id1 = t.id
                   left outer join @t t2 on t2.id2 = t.id
          group by t.id, t.val
       ) tmp on tmp.id = t.id;
13 июн 13, 14:42    [14428573]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с апдейтом  [new]
hoha_ftf
Member

Откуда: ЕКБ
Сообщений: 42
Гость333,

если возможна ситуация, когда id1 = id2, два джойна удвоят дочерние значения
13 июн 13, 15:14    [14428987]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с апдейтом  [new]
sts7865
Guest
Спасибо и извиняюсь, что мой пример меня подвел, думал с числами проще, а про сумму не подумал... :(
На самом деле val - значение но не числовое, а геометрия - полигон.
Т.е. я пересек (STIntersection) геометрии 1,2,3 и добавил их пересечения 14,15,16 в таблицу, а теперь хочу вырезать (STDifference) из исходных 1,2,3 их пересечения 14,15,16.
Т.е. должны получиться 6 неперекрывающихся полигонов.
13 июн 13, 16:54    [14429724]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить