Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Update в цикле одной таблицы, данными из другой. / 9 сообщений из 9, страница 1 из 1
26.11.2019, 15:00
    #39894526
Максим Гг.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update в цикле одной таблицы, данными из другой.
Коллеги, добрый день. Подскажите, пожалуйста, как можно реализовать следующую задачу:

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 соответственно.

Знаю, что нужно реализовывать через цикл и курсор, но только сегодня начал их изучать.
...
Рейтинг: 0 / 0
26.11.2019, 17:18
    #39894589
Максим Гг.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update в цикле одной таблицы, данными из другой.
Грустно.
...
Рейтинг: 0 / 0
26.11.2019, 17:28
    #39894595
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update в цикле одной таблицы, данными из другой.
Максим Гг.
Нужно обновить tabB.price на данные из tabC.price, при этом обновить сразу tabA.StartDate и tabA.FinishDate на tabC.StartDate и tabC.FinishDate соответственно.

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

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


2
Код: sql
1.
2.
3.
4.
5.
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
...
Рейтинг: 0 / 0
26.11.2019, 17:48
    #39894623
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update в цикле одной таблицы, данными из другой.
... в одной транзакции притом.
...
Рейтинг: 0 / 0
26.11.2019, 18:00
    #39894637
Максим Гг.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update в цикле одной таблицы, данными из другой.
court, благодарю за ответ!
Немного не дописал условие. Тк мы обновляем TabB.price, то тут необходимо сохранять историю.

Т.е. в таблице TabB для каждой изменяемой цены добавляем новую строку с новой ценой и новой начальной датой, а у старой цены - дату окончания ставим TabB.PriceStartDate=-1 от новой.
...
Рейтинг: 0 / 0
26.11.2019, 18:26
    #39894651
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update в цикле одной таблицы, данными из другой.
Максим Гг.
court, благодарю за ответ!
Немного не дописал условие. Тк мы обновляем TabB.price, то тут необходимо сохранять историю.

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
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


нуу и в транзакцию завернуть всё, как уже сказали
...
Рейтинг: 0 / 0
27.11.2019, 13:07
    #39895016
Максим Гг.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update в цикле одной таблицы, данными из другой.
court, спасибо большое! Вроде всё ОК.

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

Не совсем понимаю что это нам даёт
...
Рейтинг: 0 / 0
27.11.2019, 13:17
    #39895024
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update в цикле одной таблицы, данными из другой.
Максим Гг.,

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) то суть не поменяется?
...
Рейтинг: 0 / 0
27.11.2019, 13:23
    #39895030
Максим Гг.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update в цикле одной таблицы, данными из другой.
crutchmaster, не совсем.

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

Т.е. в TabB могут быть несколько цен с разными TabB.id, но при этом с одним TabB.idItem, по которому и идёт связка с TabA
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Update в цикле одной таблицы, данными из другой. / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]