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

Откуда: Москва
Сообщений: 8
Коллеги, добрый день. Подскажите, пожалуйста, как можно реализовать следующую задачу:

TabA (id, Code, StartDate, FinishDate)
TabB (id, price, PriceStartDate, PriceFinishDate)
Обе таблицы завязаны по ID Т.е. tabA.id = tabB.id

Есть третья таблица: TabC (code,startDate,FinishDate,price,PriceStartDate,PriceFinishDate)
tabC.code = TabA.code

Задача казалось бы простая (для более менее знающего SQL)

Нужно обновить tabB.price на данные из tabC.price, при этом обновить сразу tabA.StartDate и tabA.FinishDate на tabC.StartDate и tabC.FinishDate соответственно.

Знаю, что нужно реализовывать через цикл и курсор, но только сегодня начал их изучать.
26 ноя 19, 15:00    [22025726]     Ответить | Цитировать Сообщить модератору
 Re: Update в цикле одной таблицы, данными из другой.  [new]
Максим Гг.
Member

Откуда: Москва
Сообщений: 8
Грустно.
26 ноя 19, 17:18    [22025877]     Ответить | Цитировать Сообщить модератору
 Re: Update в цикле одной таблицы, данными из другой.  [new]
court
Member

Откуда:
Сообщений: 1956
Максим Гг.
Нужно обновить tabB.price на данные из tabC.price, при этом обновить сразу tabA.StartDate и tabA.FinishDate на tabC.StartDate и tabC.FinishDate соответственно.

Знаю, что нужно реализовывать через цикл и курсор, но только сегодня начал их изучать.
даа не нужен тут ни цикл, ни курсор

Нужен запрос UPDATE. Точнее, 2-а, так как в одном запросе можно обновить только одну таблицу
Вот и делаешь
1
update a 
set a.StartDate = c.StartDate, a.FinishDate = c.FinishDate
from TabA a inner join tabC c on c.code = a.code

2
update b
set b.price = c.price
from TabB b 
inner join TabA a on a.id = b.id
inner join tabC c on c.code = a.code
26 ноя 19, 17:28    [22025888]     Ответить | Цитировать Сообщить модератору
 Re: Update в цикле одной таблицы, данными из другой.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7383
... в одной транзакции притом.
26 ноя 19, 17:48    [22025929]     Ответить | Цитировать Сообщить модератору
 Re: Update в цикле одной таблицы, данными из другой.  [new]
Максим Гг.
Member

Откуда: Москва
Сообщений: 8
court, благодарю за ответ!
Немного не дописал условие. Тк мы обновляем TabB.price, то тут необходимо сохранять историю.

Т.е. в таблице TabB для каждой изменяемой цены добавляем новую строку с новой ценой и новой начальной датой, а у старой цены - дату окончания ставим TabB.PriceStartDate=-1 от новой.
26 ноя 19, 18:00    [22025950]     Ответить | Цитировать Сообщить модератору
 Re: Update в цикле одной таблицы, данными из другой.  [new]
court
Member

Откуда:
Сообщений: 1956
Максим Гг.
court, благодарю за ответ!
Немного не дописал условие. Тк мы обновляем TabB.price, то тут необходимо сохранять историю.

Т.е. в таблице TabB для каждой изменяемой цены добавляем новую строку с новой ценой и новой начальной датой, а у старой цены - дату окончания ставим TabB.PriceStartDate=-1 от новой.
Так, а ключ что в этой TabВ ? Не ID ?

declare @t table (id int)

-- 1
update b
set 
  b.PriceFinishDate = dateadd(day,-1,c.PriceStartDate)

output inserted.id into @t(id)

from TabB b 
inner join TabA a on a.id = b.id
inner join tabC c on c.code = a.code
where b.PriceFinishDate is null and b.price <> c.price

-- 2
insert into TabB
  (id, price, PriceStartDate, PriceFinishDate)
select
  a.id
  ,c.price
  ,c.PriceStartDate
  ,/* ??? c.PriceFinishDate */ null
from TabA a inner join tabC c on c.code = a.code
inner join @t t on t.id = a.id

-- 3
update a 
set a.StartDate = c.StartDate, a.FinishDate = c.FinishDate
from TabA a inner join tabC c on c.code = a.code
inner join @t t on t.id = a.id

нуу и в транзакцию завернуть всё, как уже сказали

Сообщение было отредактировано: 26 ноя 19, 18:28
26 ноя 19, 18:26    [22025971]     Ответить | Цитировать Сообщить модератору
 Re: Update в цикле одной таблицы, данными из другой.  [new]
Максим Гг.
Member

Откуда: Москва
Сообщений: 8
court, спасибо большое! Вроде всё ОК.

Если не сложно, расскажите, пожалуйста, о роли переменной @t в данном скрипте, а также использование inner join @t t on t.id = a.id

Не совсем понимаю что это нам даёт
27 ноя 19, 13:07    [22026594]     Ответить | Цитировать Сообщить модератору
 Re: Update в цикле одной таблицы, данными из другой.  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 948
Максим Гг.,

TabA (id, Code, StartDate, FinishDate)
TabB (id, price, PriceStartDate, PriceFinishDate)
Обе таблицы завязаны по ID Т.е. tabA.id = tabB.id

Т.е. у тебя таблицы связаны 1 к 1 и если сделать TabAB (id, Code, StartDate, FinishDate, price, PriceStartDate, PriceFinishDate) то суть не поменяется?
27 ноя 19, 13:17    [22026606]     Ответить | Цитировать Сообщить модератору
 Re: Update в цикле одной таблицы, данными из другой.  [new]
Максим Гг.
Member

Откуда: Москва
Сообщений: 8
crutchmaster, не совсем.

В TabA есть id который в таблице TabB называется idItem. Они связаны. Также в TabB есть свой ID-шник, для TabA он роли не играет. Я прям детально не стал всё описывать, скрипт от уважаемого Court подправил. Но хотелось бы разобраться в деталях.

Т.е. в TabB могут быть несколько цен с разными TabB.id, но при этом с одним TabB.idItem, по которому и идёт связка с TabA
27 ноя 19, 13:23    [22026615]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить