Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 курсор для UPDATE  [new]
gomargo
Member

Откуда: Москва
Сообщений: 33
я хочу обновить одну таблицу данными из другой таблицы (одинаковых полей нет, пришлось пользоваться left join и связывать через другие 3 таблицы, худо бедно написала update с selectom и тремя left join-нами, но понадобился КУРСОР! С курсорами я никогда не сталкивалась и вообще не могу найти нужную структуру запроса... помогите мозгом, пожалуйста, инет перерыла и не могу найти корректную структуру.

UPDATE таблица в которой надо обновить поля
SET поле для обновления =
(SELECT
алиас.поле-сцепка,
алиас.поле-сцепка,
алиас.поле-сцепка,
алиас.поле-сцепка
FROM таблица алиас
left join таблица алиас ON алиас.поле = алиас.поле
left join таблица алиас ON алиас.поле = алиас.поле
left join таблица алиас ON алиас.поле =алиас.поле and алиас.год= алиас.год
WHERE алиас.год = 2015
)

и таких годов может быть неизвестное количество, поэтому и понадобился курсор, под который, я не могу подстроить всё это дело
13 апр 15, 17:25    [17509187]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Для чего вам понадобился курсор?
13 апр 15, 17:30    [17509218]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
gomargo, заполните годами таблицу. Мыслите реляционно :)
13 апр 15, 17:31    [17509226]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
gomargo
Member

Откуда: Москва
Сообщений: 33
Владислав Колосов, да я бы с радостью ахах, но дело несовсем в них - каждый год содержит деньги, суммы которых я и обновляю из одной таблицы другой, деньги выделяются иногда на три года, иногда на один и вот курсор нужен, чтобы он обновил столько денег, сколько есть лет финансирования
13 апр 15, 17:55    [17509313]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
gomargo
Member

Откуда: Москва
Сообщений: 33
SQL2008,

чтобы запрос на обновление нужных мне полей повторялся столько раз, сколько выделено на это лет, т.е. если 2005, 2006, 2007 - то обновление надо сделать три раза... а иногда это только 2005 например
13 апр 15, 17:59    [17509326]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
Gviber
Member

Откуда:
Сообщений: 124
DECLARE @Param1 int, @Param2 int
DECLARE MyCurs CURSOR FOR
SELECT c1,c2 FROM  table

OPEN MyCurs
WHILE 1=1
BEGIN

   FETCH MyCurs INTO @Param1, @Param2
   IF @@FETCH_STATUS <> 0 BREAK  

---text  

END
CLOSE MyCurs
DEALLOCATE MyCurs
13 апр 15, 17:59    [17509327]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
gomargo, чем менее точно зададите вопрос, тем менее точно получите ответ.
13 апр 15, 18:03    [17509338]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
gomargo
Member

Откуда: Москва
Сообщений: 33
Gviber,

спасибо БОЛЬШОЕ, и вместе с тем не пойму где будет UPDATE
13 апр 15, 18:04    [17509342]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
Gviber
Member

Откуда:
Сообщений: 124
Там где "---text "
13 апр 15, 18:05    [17509344]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
Почему Вы уверены, что Вам нужен именно курсор?
13 апр 15, 18:08    [17509354]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
gomargo
Member

Откуда: Москва
Сообщений: 33
Владислав Колосов, потому что мне необходимо повторять мой запрос неопределенное количество раз и выводить (обновлять) неопределенное количество строк, которое зависит от того на сколько лет распределены деньги, суммы которых я обновляю из одной таблицы в другую.
13 апр 15, 18:32    [17509414]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
gomargo
Member

Откуда: Москва
Сообщений: 33
Gviber,

спасибо, попробую понять что куда и зачем )
) спасибо большое
13 апр 15, 18:57    [17509501]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
gomargo
Владислав Колосов, потому что мне необходимо повторять мой запрос неопределенное количество раз и выводить (обновлять) неопределенное количество строк, которое зависит от того на сколько лет распределены деньги, суммы которых я обновляю из одной таблицы в другую.

Позвольте с вами не согласиться!
От чего зависит величина "неопределенное количество раз"?
Вы хотите сказать, что ваш курсор будет выполнять циклы "неопределенное количество раз"?
Как вы ему это объясните?
13 апр 15, 19:09    [17509545]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Gviber
DECLARE @Param1 int, @Param2 int
DECLARE MyCurs CURSOR FOR
SELECT c1,c2 FROM  table

OPEN MyCurs
WHILE 1=1
BEGIN

   FETCH MyCurs INTO @Param1, @Param2
   IF @@FETCH_STATUS <> 0 BREAK  

---text  

END
CLOSE MyCurs
DEALLOCATE MyCurs
Бориска, откуда ты велез со своими вредными советами?
13 апр 15, 22:52    [17510162]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21254
gomargo
чтобы запрос на обновление нужных мне полей повторялся столько раз, сколько выделено на это лет, т.е. если 2005, 2006, 2007 - то обновление надо сделать три раза... а иногда это только 2005 например

Курсор нужен, чтобы перебрать имеющиеся записи. У Вас что, столько записей в исходной таблице, на сколько лет размазано выделение средств? Если так - нахрена курсор, апайте таблицу без отбора по году... а если запись одна, опять-таки нахрена курсор - просто добавьте в список таблиц-источников синтетическую таблицу сета годов нужной толщины (сколько там по максимуму - лет пять? можно даже не извращаться и обойтись тупым select 2010 union select 2011 и т.п.).
13 апр 15, 22:58    [17510177]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21254
gomargo
мне необходимо повторять мой запрос неопределенное количество раз и выводить (обновлять) неопределенное количество строк, которое зависит от того на сколько лет распределены деньги
Так это самое "от того на сколько лет распределены деньги" - оно всё-таки определённое или НЕопределённое? Вы уж (сорри за тавтологию) определитесь...
13 апр 15, 23:00    [17510184]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
Gviber
Member

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

Человек просил курсор даже тему так назвал. Что не так?
14 апр 15, 10:26    [17511340]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
gomargo
Member

Откуда: Москва
Сообщений: 33
Akina, мне как раз и надо перебрать существующие записи. Рада, что у вас такие широкие познания в этой области, но мне нужен именно курсор, структуру которого мне уже прислали выше. Спасибо им и Вам за такое "бурное" вникание в суть моего размытого вопроса :)
14 апр 15, 14:59    [17513226]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
gomargo
Member

Откуда: Москва
Сообщений: 33
Gviber,
добра Вам :)
14 апр 15, 15:03    [17513249]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
gomargo
Akina, мне как раз и надо перебрать существующие записи. Рада, что у вас такие широкие познания в этой области, но мне нужен именно курсор, структуру которого мне уже прислали выше. Спасибо им и Вам за такое "бурное" вникание в суть моего размытого вопроса :)
И курсор не нужен, и написали его плохо!
Пилите, Шура, пилите! ©
14 апр 15, 15:05    [17513258]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
gomargo, человеку, который говорит, что ему нужен курсор, но не может корректно сформировать свою задачу понятным образом, с 99% вероятностью курсор не нужен.

Использовав курсор, вы, скорее всего, сделаете плохой и неэффективный код. Возможно, он будет работать и даже делать то, что надо. Но с большой вероятностью его можно сделать более простым и удобным образом - и форумчане бы даже помогли вам в этом, если бы вы привели исходную проблему и структуру имеющихся данных, а не просили бы именно курсор.
14 апр 15, 15:10    [17513289]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
Glory
Member

Откуда:
Сообщений: 104751
gomargo
мне как раз и надо перебрать существующие записи.

Вы не поверите, но любой запрос собственно тем и занимается, что перебирает записи в таблицах.
14 апр 15, 15:13    [17513320]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
Gviber
Member

Откуда:
Сообщений: 124
iap
и написали его плохо

Ок. Что не так с курсором?

Для обхода списка через курсор я знаю только два патерна: вариант выше + этот:

FETCH NEXT FROM product_cursor INTO @product  
 
WHILE @@FETCH_STATUS = 0
BEGIN
    --TEXT
    FETCH NEXT FROM product_cursor INTO @product
END


Хотите сказать, что первый вариант хуже?
14 апр 15, 15:33    [17513477]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Gviber
iap
и написали его плохо

Ок. Что не так с курсором?

Для обхода списка через курсор я знаю только два патерна: вариант выше + этот:

FETCH NEXT FROM product_cursor INTO @product  
 
WHILE @@FETCH_STATUS = 0
BEGIN
    --TEXT
    FETCH NEXT FROM product_cursor INTO @product
END



Хотите сказать, что первый вариант хуже?
Хочу сказать, что курсор по-умолчанию - динамический.
Что самый быстрый - FAST_FORWARD.
Что наверно, правильнее объявить его локальным (LOCAL).
Что хорошо бы задать порядок в курсоре (для воспроизводимости) с помощью ORDER BY...
14 апр 15, 15:39    [17513532]     Ответить | Цитировать Сообщить модератору
 Re: курсор для UPDATE  [new]
Gviber
Member

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

Вам все же лучше описать вашу задачу. Курсоры это кривая (с точки зрения БД) и очень медленная штука. Если вам не нужно на каждом шаге дополнительно вызывать хранимую процедуру или делать несколько операций то курсор скорее всего не нужен.

Думаю, ваша задача решается примерно так:

Update T1
Set T1.Cl=T3.Cl
From Mytable T1 
Join T2 onJoin T3 on

Т.е. тут несколько join но вносим изменение только в таблицу T1
14 апр 15, 15:46    [17513603]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить