Arinyshka
Белый клоун, бедный мученик...
Постоялец
Offline
Пол:
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #30 : 20-05-2008 11:25 » |
|
Теперь я делаю так: CREATE PROCEDURE dbo.procedure4 AS BEGIN update t_group set id_PurpPay = dbo.GetIdPurp(t_group.id_group) END
Где dbo.GetIdPurp - это функция, которая таки возвращает по t_group.id_group нужный мне Id_PurpPay. Такая конструкция обновит ВСЕ поля в таблице t_group? Она уже минут 5 выполняется... не знаю, снимать или подождать ![Жаль](/Smileys/test/frown.gif)
|
|
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
Arinyshka
Белый клоун, бедный мученик...
Постоялец
Offline
Пол:
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #31 : 20-05-2008 11:27 » |
|
Да, выполнилась ![Улыбаюсь](/Smileys/test/smile.gif) Все нормально ![Улыбаюсь](/Smileys/test/smile.gif) УРРААА!!! Хорошие, золотые мои, что б я без вас делала??? ![Люблю!](/Smileys/test/love.gif)
|
|
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #32 : 20-05-2008 19:58 » |
|
Убейте меня, если я понимаю, почему не работал if... Это всегда пожалуйста ![Улыбаюсь](/Smileys/test/smile.gif) Так работать не будет IF @X = NULL ... Надо так IF @X IS NULL ... Или так IF @X IS NOT NULL ... В зависимости от потребностей. А два раза делать запрос нехорошо (с точки зрения производительности).
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Sla
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #33 : 20-05-2008 21:40 » |
|
Arinyshka, тому що потому что Null нельзя сравнивать, его можно только определить ![Улыбаюсь](/Smileys/test/smile.gif) Это нельзя понять, это можно только запомнить (с) Кто сказал не знаю, но помню что сказал не я ![Улыбаюсь](/Smileys/test/smile.gif)
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Arinyshka
Белый клоун, бедный мученик...
Постоялец
Offline
Пол:
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #34 : 21-05-2008 06:37 » |
|
А два раза делать запрос нехорошо (с точки зрения производительности).
угу, пасиб... разницу уловила. Про запрос 2 раза - я подозревала, что это нехорошо.. И уже в другом месте сейчас тыкаюсь почти в такую же ситуацию... как этого можно было избежать? Результату запроса можно назначить ...эээ... псевдоним, да? - как таблице в запросе? Ну, вот мы пишем: select t1.id, t1.name from table t1
А можно так результату запроса? Типа (select t1.id, t1.name from table t1) z1
И выбирать что-нить из z1 потом, как из таблицы? Arinyshka, тому що потому что Null нельзя сравнивать, его можно только определить ![Улыбаюсь](/Smileys/test/smile.gif) Это нельзя понять, это можно только запомнить (с) Кто сказал не знаю, но помню что сказал не я ![Улыбаюсь](/Smileys/test/smile.gif) так и запомню - нельзя сравнивать с пустотой, ибо пустота бесконечна... ![Улыбаюсь](/Smileys/test/smile.gif) )
|
|
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #35 : 22-05-2008 05:59 » |
|
Arinyshka, в данном случае так абстрактно спрашивать нельзя. Если это подзапрос запроса, то можно. Если отдельный запрос, то нельзя - только через переменную типа table или временную таблицу.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Arinyshka
Белый клоун, бедный мученик...
Постоялец
Offline
Пол:
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #36 : 22-05-2008 06:50 » |
|
Arinyshka, в данном случае так абстрактно спрашивать нельзя. Если это подзапрос запроса, то можно. Если отдельный запрос, то нельзя - только через переменную типа table или временную таблицу.
Понятненько ![Улыбаюсь](/Smileys/test/smile.gif) я имела в виду собственную тяжеловесную конструкцию: if EXISTS (SELECT id_PurposePay from PurposeOfPayment where PurposePay = @strtemp) begin set @tempId =(SELECT id_PurposePay from PurposeOfPayment where PurposePay = @strtemp) end
Значит, можно как-то так, но не компилится: if EXISTS (SELECT id_PurposePay from PurposeOfPayment where PurposePay = @strtemp) res begin set @tempId =res end
Так тоже не компилится: (SELECT id_PurposePay from PurposeOfPayment where PurposePay = @strtemp) rs
if EXISTS rs
begin set @tempId =rs end
А как это правильно оформить? Чтобы использовать результаты подзапроса в других запросах в пределах одной хранимой?
|
|
« Последнее редактирование: 22-05-2008 06:52 от Arinyshka »
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
Sla
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #37 : 22-05-2008 07:19 » |
|
а вот так? select @tempId = id_PurposePay from PurposeOfPayment where PurposePay = @strtemp
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Arinyshka
Белый клоун, бедный мученик...
Постоялец
Offline
Пол:
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #38 : 22-05-2008 07:21 » |
|
Просто, без псевдонимов (это так называется?) запрос работает, все в порядке. Хотелось научиться использовать его результаты несколько раз
|
|
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
Sla
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #39 : 22-05-2008 07:42 » |
|
в принципе, ничего страшного не произойдет если ты будешь делать два запроса подряд в одной сессии - на производительность это может повлиять не очень сильно но вот если надо в одной процедуре два серьезных запроса делать, то нужно пересматривать алгоритм работы т.е. Select 1 что-то делаю
Что- то делаю другое
Select 1 что-то делаю
но Select 1 что-то делаю 1 Select 1 что-то делаю 2
нужно превратить
Select 1 что-то делаю 1 что-то делаю 2
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Arinyshka
Белый клоун, бедный мученик...
Постоялец
Offline
Пол:
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #40 : 22-05-2008 08:46 » |
|
ага... ок, обдумаю ![Улыбаюсь](/Smileys/test/smile.gif)
|
|
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
Arinyshka
Белый клоун, бедный мученик...
Постоялец
Offline
Пол:
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #41 : 22-05-2008 09:05 » |
|
А вот такая конструкция: CREATE PROCEDURE dbo.Fill_F_RS_idTypeRS AS BEGIN declare @temp_idRS INT
update f_rs
if f_rs.Tip_RS = 0 set @temp_idRS = 1 else set @temp_idRS = 2 set f_rs.id_TypeRS = @temp_idRS END
почему не коммитится? Ничего не понимаю ![Жаль](/Smileys/test/frown.gif) У меня появилось новое поле в таблице, мне нужно его автоматом заполнить. Да, глупо, что оно зависит от значения поля в этой же таблице... Это не совсем так, но первоначальные данные нужно вбить именно в такой зависимости. Бо таблица существует в реальной БД, там свыше 5000 записей, реорганизация дается дорого... а может, создавать временную таблицу, поле в ней и уже потом update нужное мне поле в f_rs?
|
|
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #42 : 22-05-2008 11:43 » |
|
Хотелось научиться использовать его результаты несколько раз Вот это-то меня и смущает. Какой-то алгоритмический подход к задаче. Ты LISP знаешь?
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Arinyshka
Белый клоун, бедный мученик...
Постоялец
Offline
Пол:
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #43 : 22-05-2008 11:48 » |
|
нет, не знаю ![Жаль](/Smileys/test/frown.gif) С sql столкнулась впервые буквально месяц назад. Сейчас вот по работе delphi+sql. Мыслю, действительно, на старом добром Паскале... уж не судите строго :'(
|
|
« Последнее редактирование: 22-05-2008 11:56 от Arinyshka »
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
Arinyshka
Белый клоун, бедный мученик...
Постоялец
Offline
Пол:
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #44 : 22-05-2008 12:00 » |
|
А вот такая конструкция: CREATE PROCEDURE dbo.Fill_F_RS_idTypeRS AS BEGIN declare @temp_idRS INT
update f_rs
if f_rs.Tip_RS = 0 set @temp_idRS = 1 else set @temp_idRS = 2 set f_rs.id_TypeRS = @temp_idRS END
почему не коммитится? Ничего не понимаю ![Жаль](/Smileys/test/frown.gif) У меня появилось новое поле в таблице, мне нужно его автоматом заполнить. Да, глупо, что оно зависит от значения поля в этой же таблице... Это не совсем так, но первоначальные данные нужно вбить именно в такой зависимости. Бо таблица существует в реальной БД, там свыше 5000 записей, реорганизация дается дорого... а может, создавать временную таблицу, поле в ней и уже потом update нужное мне поле в f_rs? из такой ситуации уже второй раз выхожу одинаково: пишу отдельно функцию, определяющую значение для 1 поля, и процедуру с update table, ровненько вызывающую эту функцию... Разве это правильная последовательность действий?
|
|
|
Записан
|
Непонятная свобода обручем сдавила грудь...
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #45 : 22-05-2008 15:56 » ![new](/Themes/VU3/images/english/new.gif) |
|
Поскольку SQL всё же язык более функциональный, то все подобные вещи делаются так: UPDATE T_Group SET id_PurpPay = T.id_PurposePay FROM (SELECT id_PurposePay FROM PurposeOfPayment WHERE PurposePay = @strtemp) T Если подзапрос T вернул записи, то UPDATE выполнится - для всех записей T_Group значение поля обновится на значение id_PurposePay первой записи подзапроса. Если же запрос запись не вернул, то UPDATE вообще не выполнится. И не надо никаких временных сохранений, проверок, нагромождения функций и т.д. P.S. А с функциональным программированием для общего развития рекомендую познакомиться - это отдельная парадигма программирования, в ней мозги по-другому работают ![Улыбаюсь](/Smileys/test/smile.gif) . Нужно мыслить решение задачи как композицию функций, когда результаты одной тут же подставляются в параметры другой, при этом понятия "переменная" (как область памяти, куда можно записывать разные значения) вообще нет, есть лишь символические обозначения как в математике. Центральным местом функционального программирования является лямбда-исчисление Чёрча.
|
|
« Последнее редактирование: 22-05-2008 16:00 от dimka »
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
HandKot
Молодой специалист
Offline
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #46 : 23-05-2008 04:16 » |
|
если я правильно понял следующий код update f_rs
if f_rs.Tip_RS = 0 set @temp_idRS = 1 else set @temp_idRS = 2 set f_rs.id_TypeRS = @temp_idRS то делается это так (MS_SQL) update f_rs set id_TypeRS = case when Tip_RS = 0 then 1 else 2 end
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
|