Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Максим Гг. Member Откуда: Москва Сообщений: 17 |
Коллеги, добрый день. Подскажите, пожалуйста, как можно реализовать следующую задачу: 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] Ответить | Цитировать Сообщить модератору |
Максим Гг. Member Откуда: Москва Сообщений: 17 |
Грустно. |
26 ноя 19, 17:18 [22025877] Ответить | Цитировать Сообщить модератору |
court Member Откуда: Сообщений: 2253 |
Нужен запрос 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] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8350 |
... в одной транзакции притом. |
26 ноя 19, 17:48 [22025929] Ответить | Цитировать Сообщить модератору |
Максим Гг. Member Откуда: Москва Сообщений: 17 |
court, благодарю за ответ! Немного не дописал условие. Тк мы обновляем TabB.price, то тут необходимо сохранять историю. Т.е. в таблице TabB для каждой изменяемой цены добавляем новую строку с новой ценой и новой начальной датой, а у старой цены - дату окончания ставим TabB.PriceStartDate=-1 от новой. |
26 ноя 19, 18:00 [22025950] Ответить | Цитировать Сообщить модератору |
court Member Откуда: Сообщений: 2253 |
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] Ответить | Цитировать Сообщить модератору |
Максим Гг. Member Откуда: Москва Сообщений: 17 |
court, спасибо большое! Вроде всё ОК. Если не сложно, расскажите, пожалуйста, о роли переменной @t в данном скрипте, а также использование inner join @t t on t.id = a.id Не совсем понимаю что это нам даёт |
27 ноя 19, 13:07 [22026594] Ответить | Цитировать Сообщить модератору |
crutchmaster Member Откуда: оттуда. Сообщений: 2140 |
Максим Гг.,
Т.е. у тебя таблицы связаны 1 к 1 и если сделать TabAB (id, Code, StartDate, FinishDate, price, PriceStartDate, PriceFinishDate) то суть не поменяется? |
||
27 ноя 19, 13:17 [22026606] Ответить | Цитировать Сообщить модератору |
Максим Гг. Member Откуда: Москва Сообщений: 17 |
crutchmaster, не совсем. В TabA есть id который в таблице TabB называется idItem. Они связаны. Также в TabB есть свой ID-шник, для TabA он роли не играет. Я прям детально не стал всё описывать, скрипт от уважаемого Court подправил. Но хотелось бы разобраться в деталях. Т.е. в TabB могут быть несколько цен с разными TabB.id, но при этом с одним TabB.idItem, по которому и идёт связка с TabA |
27 ноя 19, 13:23 [22026615] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |