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

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
Update в цикле одной таблицы, данными из другой.
    #39894589
Максим Гг.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Грустно.
...
Рейтинг: 0 / 0
Update в цикле одной таблицы, данными из другой.
    #39894595
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Максим Гг.
Нужно обновить 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
Update в цикле одной таблицы, данными из другой.
    #39894623
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... в одной транзакции притом.
...
Рейтинг: 0 / 0
Update в цикле одной таблицы, данными из другой.
    #39894637
Максим Гг.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court, благодарю за ответ!
Немного не дописал условие. Тк мы обновляем TabB.price, то тут необходимо сохранять историю.

Т.е. в таблице TabB для каждой изменяемой цены добавляем новую строку с новой ценой и новой начальной датой, а у старой цены - дату окончания ставим TabB.PriceStartDate=-1 от новой.
...
Рейтинг: 0 / 0
Update в цикле одной таблицы, данными из другой.
    #39894651
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Максим Гг.
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
Update в цикле одной таблицы, данными из другой.
    #39895016
Максим Гг.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court, спасибо большое! Вроде всё ОК.

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

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

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

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

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


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