Текущий архив: 2006.10.15;
Скачать: CL | DM;
ВнизПочему не работает такой запрос? Найти похожие ветки
← →
lexander (2006-08-08 23:46) [0]Подскажите! Использую ADO под Access
UPDATE t_stud
SET t_stud.suma = (SELECT Sum(t_plat.suma) FROM t_plat
GROUP BY t_plat.id_stud HAVING ((t_plat.id_stud)=28))
WHERE t_stud.id_stud = 28;
Дает ошибку "В операции должен использоваться обновляемый запрос"
← →
Johnmen © (2006-08-09 00:43) [1]К какому селу здесь группировка???
← →
ANB © (2006-08-09 09:52) [2]UPDATE t_stud
SET t_stud.suma = (SELECT Sum(t_plat.suma) FROM t_plat
where t_plat.id_stud=28)
WHERE t_stud.id_stud = 28;
В оракле такая конструкция прокатывает :)
← →
Anatoly Podgoretsky © (2006-08-09 19:30) [3]Johnmen © (09.08.06 00:43) [1]
Не только груп но и Having
И что прикажете делать если select вернет больше одной записи? В соседнии записывать?
← →
lexander (2006-08-09 20:03) [4]ну а что мне делать?
есть таблица студентов
есть таблица платежей студентов
связь один-ко-многим
нужно в конце года найти сумму всех платежей каждого студента и в таблицу со студентами каждому записать эту сумму минус стоимость за год, т.е. найти переплату или долг
вложенный запрос полюбому должен был возвращать одну запись, там отбор по id студента шел
← →
lexander (2006-08-09 20:44) [5]в общем мне нужно найти сумму по столбцу одной таблицы и записать ее в ячейку в другой таблицы...
Подскажите как это можно сделать?
← →
Mike Kouzmine © (2006-08-09 22:14) [6]Anatoly Podgoretsky © (09.08.06 19:30) [3] Select sum() вряд ли
вернет больше одной записи. Мне кажется.
← →
evvcom © (2006-08-10 08:48) [7]> [4] lexander (09.08.06 20:03)
> ну а что мне делать?
Ну а [2] ты попробовал? Где результаты?
Чукча не читатель, чукча писатель (с) не помню
← →
ANB © (2006-08-10 10:15) [8]
> lexander (09.08.06 20:44) [5]
А id_stud ты собираешься каждый раз ручками подставлять ?
UPDATE t_stud
SET t_stud.suma = (SELECT Sum(t_plat.suma) FROM t_plat
where t_plat.id_stud=t_stud.id_stud)
Правда, не совсем понятно, зачем это нужно - проще на лету посчитать и показать.
← →
lexander (2006-08-10 12:42) [9]> А id_stud ты собираешься каждый раз ручками подставлять ?
Да как не крути, хоть ручками, хоть так как у Вас - ошибка одна и таже... (я так написал для простоты восприятия запроса)
> Правда, не совсем понятно, зачем это нужно - проще на лету посчитать
Просто далее данная сумма ипользуется в расчетах, которые тоже должны быть записаны в таблицу t_stud, т.к. информация с таблицы t_plat будет удалена
> Ну а [2] ты попробовал? Где результаты?
Конечно пробывал. А какая разница между этим запрсом и тем что я приводил. Результат подзапроса один и тот же... и ошибка таже
← →
Desdechado © (2006-08-10 12:47) [10]> А какая разница между этим запрсом и тем что я приводил.
Большая. Если не видишь ее, то тебе в желтую прессу писульки писать, а не программы.
> Правда, не совсем понятно, зачем это нужно - проще на лету посчитать
Не только проще, но и правильней.
> далее данная сумма ипользуется в расчетах, которые тоже должны быть записаны в таблицу t_stud
И что?
> т.к. информация с таблицы t_plat будет удалена
Финансовые документы так не ведут. История платежей хранится пожизненно.
← →
evvcom © (2006-08-10 13:09) [11]> [9] lexander (10.08.06 12:42)
> Результат подзапроса один и тот же... и ошибка таже
Чую, не там копаешь. А ты уверен, что приведенный тобою запрос вообще пытается выполняться? Запиши заведомо ошибочный (синтаксически) запрос вместо апдейта и посмотри, изменится ли код/текст ошибки?
← →
lexander (2006-08-10 13:56) [12]> Большая. Если не видишь ее, то тебе в желтую прессу писульки писать, а не программы.
Я спорить не буду я в БД новичок... но то что результат они дают один и тот же это точно. И не надо так критично, я не очень пока знаю все возможности запросов, но с логикой у меня все в порядке. (мне в прессе сказали :) )
> Финансовые документы так не ведут. История платежей хранится пожизненно.
Поверь там такая ситуация, что хранить их в БД пожизненно с тем учетом что они будут налету пересчитываться - невозможно (по крайней мере не рационально)
____________________________________________________________
В общем ладно... объяснить Вам всю ситуацию - это отдельная тема - долго
(я чувствую еще немного - и мне придется идти в прессу - самоутверждаться)
Закрываю тему! ВСЕМ СПАСИБО ЗА УЧАСТИЕ!
← →
sniknik © (2006-08-10 20:56) [13]> Закрываю тему! ВСЕМ СПАСИБО ЗА УЧАСТИЕ!
зря... не все ее еще видели ;о).
для access действительно с подзапросов в апдейте не пройдет, и дело скорее всего не в реальном количестве возвращаемях записей, а в том что при апдейде строится обьеденение, а при обьеденении с подзапрсом результат получается необновляемый рекордсет... о чем и ошибка.
зато можно так
вместо ошибочного> UPDATE t_stud
> SET t_stud.suma = (SELECT Sum(t_plat.suma) FROM t_plat
> GROUP BY t_plat.id_stud HAVING ((t_plat.id_stud)=28))
> WHERE t_stud.id_stud = 28;
для всего одной всего обновляемой записиUPDATE t_stud
SET suma = DSum("suma", "t_plat", "id_stud="+CStr(id_stud))
это для всех записей в таблице t_stud (при условии что и там есть поле id_stud, должно быть по идее но не показано...)
проверь, если не ошибся в деталях должно работать. переделать для одной... ну думаю не проблема.
← →
lexander (2006-08-10 23:21) [14]СПАСИБО!!! Вот этого мне и не хватало...
Я не знал про существование этих функций.
А их оказалось очень много :)
(А то меня тут заклевали совсем...)
Вопрос - эти функции используються в запросах только к Access или это стандартные функции SQL. Т.е. где искать информацию о них в литературе об Access или в литературе про SQL
← →
sniknik © (2006-08-11 01:40) [15]конечно к аксесс (вернее к jet, ядро, + бейсик который это ядро поддерживает... не весь правда), вообще сам по себе SQL довольно бедный язык (выучить за пару прочтений можно... была брошурка "чистый sql" в 12 -15 страниц все вложилось...), т.что любые более менее интересные "фишки" это признаки конкретного SQL сервера/движка, можно даже не сомневаться.
← →
lexander (2006-08-11 20:10) [16]Еще раз большое Вам спасибо!!!
Последнее, может у вас есть ссылка на какой-нибудь ресурс с описанием всех этих функций на русском! А то хелп в Ассess на английском, а он у меня на троечку...
← →
sniknik © (2006-08-11 20:52) [17]> А то хелп в Ассess на английском
поставь рускую/с другого диска версию мс оффиса, есть русский хелп, видел (может не все переведено но есть...) либо на мелкософте поищи, там тоже могут быть отдельно доки, и там они делятся по языкам при скачке.
← →
Anatoly Podgoretsky © (2006-08-12 14:14) [18]sniknik © (11.08.06 20:52) [17]
Не обнаружил ни одного куска на английском языке.
← →
sniknik © (2006-08-13 01:22) [19]Anatoly Podgoretsky © (12.08.06 14:14) [18]
выслать? ;) у меня их в избытке, большая часть в общемто. но меня это как то не напрягает... на работе вроде бы, даже другие части по руски, но даже не думал принести обьеденить, чтобы больше руских хелпов было. что есть то и есть, и ладно. :-)
← →
lexander (2006-08-13 02:03) [20]sniknik ©
Подскажите еще... после апдейта через ADOCommand, как обновить DataSet, работающий с тойже таблицей что обновлялась. Я это делаю открывая и закрывая DataSet - при этом сбивается маркер - идет в начало. Почемуто refresh - результата не дает ни какого.
Может можно както правильнее обновлять?
(в данном случае информация отображается на Гриде)
А за функции, большое спасибо все пока работает на ура...!!!
← →
lexander (2006-08-13 03:37) [21]И сразу, пока вспомнил...
Если мне надо во время работы программы скопировать базу данных (сделать копию) - есть необходимость отключать ADOConnection
Это при том, что я не использую методы компонент для работы с БД, а все делаю через запросы (просто я так понял через методы БД не сразу обновляется)
← →
lexander (2006-08-13 04:50) [22]Простите за назойливость: еще один вопрос к sniknik ©
Скажите а в запросах типа DSum("suma", "t_plat", "id_stud="+CStr(id_stud))
можно использовать присвоения переменным ну что-то типа
IIf(a=DSum("suma", "t_plat", "id_stud="+CStr(id_stud));a;0)
Получается что в случае если нет полей он суммирует и возвращает не ноль (как ожидалось) а NULL. Программно из Delphi я это конечно смогу обработать, а вот чтоб дальше в запросе - не получается. Можно конечно извратиться и поставить выражение DSum и на условие и на результат, т.е. если сумма есть то она же и возвращается если нет то ноль. Просто я подумал может там все проще - я ведь не знаю еще всех возможностей функций Access
За ранее Вам благодарен!!!
← →
sniknik © (2006-08-13 13:39) [23]> в случае если нет полей он суммирует и возвращает не ноль (как ожидалось) а NULL.
null как раз более правильно ожидать... ноль это когда чтото есть и у него в подсчитиваемом поле значение/я = 0, а если поля/значения вообще нет то null. это логично, а вот 0 и когда сумма = 0 и значений нет тоже = 0 нелогично.
лучше смени ожидания..., ну или два раза выполняй подсчет в функции. хотя может там есть и другой способ, я тоже далеко не все там знаю (слишком много всего, и если это чтото мне не нужно, то специально учить не собираюсь).
← →
Lexander (2006-08-13 15:04) [24]Спасибо, понял!
А что по поводу [20]и и[21]
Страницы: 1 вся ветка
Текущий архив: 2006.10.15;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.044 c