Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.29;
Скачать: CL | DM;

Вниз

Запрос из подчиненной таблицы   Найти похожие ветки 

 
Julia   (2004-01-05 07:13) [0]

Подскажите, пожалуйста. Помогите найти другое решение.
Есть 2 таблицы: главная и подчиненная. Запросом беру необходимые данные из подчиненной и сравниваю циклом в цикле
while not eof Table1 и while not eof Запрос, и если Table1.Field1=Запрос.Field1, то Table1 корректирую и Table1.Field2 присваиваю значение из определенного поля запроса. Затем Table1.First, а Запос.Next и все сначала.
Процесс идет довольно длительно, учитывая что Table1 крутится с начала до самого конца столько раз, сколько записей в запросе. Может, есть другой выход?


 
Ильш ©   (2004-01-05 07:18) [1]

А зачем Table1.First? Ты же уже вроде бы проглядел все записи с начала Table1? Так иди дальше. Зачем First?


 
Julia   (2004-01-05 07:26) [2]

Я беру первую запись запроса. Работаю с ней. И в этот момент таблицу проглядываю с начала до конца. Нашла то, что надо в таблице и заполнила в ней поле. Затем яперехожу к следующей записи запроса и опять ищу то, что надо в таблице, конечно же сначала до конца.


 
Julia   (2004-01-05 07:50) [3]

Как сделать это через update?


 
Sergey13 ©   (2004-01-05 08:24) [4]

В общем случае примерно так:
update table1
set pole1=(select pole1 from table2 where ...)
В подзапросе по условию должна выводиться ОДНА запись.


 
Julia   (2004-01-05 08:45) [5]

SERGEY13.
У меня пример такой. Главная таблица содержит инф-цию по пациенту, подчиненная - услуги ему оказанные. Нужно запросом суммировать оплату за услуги по пациенту в подчиненной таблице и сумму подставить в главную таблицу. Как их связать в подобном Update по полю Table1.cod и Запрос на сумму.Cod. Была бы вместо запроса таблица я бы написала
update table1 as a
inner join table2 as b
on a.cod=b.cod
set a.summa=b.summa
Но проблема в том, что у меня не Table2, а запрос.


 
Sergey13 ©   (2004-01-05 09:04) [6]

2Julia (05.01.04 08:45) [5]
Ну во первых апдейтить таблицу пациентов при этом плохой тон. Я не говорю что это совсем уж неправильно, но криво - это точно.
Тебе (если уж шибко хочется) нужно примерно так:
update table1 a
set a.summa=(select sum(b.summa) from table2 b where a.cod=b.cod)

Но повторюсь, это неправильно. Эту сумму можно получать динамически, а не апдейтить главную таблицу при каждом новом платеже в подчиненной.
Нечто вроде:
select a.cod,sum(b.summa)
from table1 a,table2 b
where a.cod=b.cod
group by a.cod

>Но проблема в том, что у меня не Table2, а запрос.
Не понял, это то тут при чем?


 
Julia   (2004-01-05 09:15) [7]

Sergey13.
Это я первоначально и делала в динамике, но программа срезается после обработки нескольких пациентов. Дает ошибку памяти kernel32(т.к. я выполняю сразу и другие запросы на вычисление других сумм), видимо из-за того что память забивается этими запросами, хотя я их вроде и закрывала. В общем, устранить причину мне так и не удалось. Поэтому я и перехожу к апдейту, но делаю это не как ты думаешь при каждом новом платеже, а 1 раз в месяц перед выполнением расчетов.


 
Sergey13 ©   (2004-01-05 09:25) [8]

2Julia (05.01.04 09:15) [7]
>(т.к. я выполняю сразу и другие запросы на вычисление других сумм)
В потоках что ли?
>В общем, устранить причину мне так и не удалось
Но это не причина, ИМХО, для перехода к заведомо неправильному решению. Искать надо тщательнее. Велики ли объемы данных?


 
Julia   (2004-01-05 09:39) [9]

>В потоках что ли?
Нет, не в потоках, а сразу вполняется другой запрос на обработку других данных из подчиненной таблицы. И такого рода запросов видов 8-10.
>Велики ли объемы данных?
В том то и парадокс, что данных-то в базе не более 500, т.е. давольно-таки мало. А после обработки 16 пациентов дает ошибку памяти. Долго билась над этим. Чуть подкорректировала запросы, но единственно чего добилась, программа стала срезаться после скажем 26 пациентов.


 
Sergey13 ©   (2004-01-05 09:48) [10]

2Julia (05.01.04 09:39) [9]
>а сразу вполняется другой запрос на обработку других данных из подчиненной таблицы. И такого рода запросов видов 8-10.
Ну прям таки сразу. 8-)

>А после обработки 16 пациентов дает ошибку памяти.
Ты их в циклах гоняешь? Наверное тут собака порылась. Хотя точный диагноз возможен только в присутствии еще живого пациента.

И что значит "срезаться"? Может у тебя винда кривая? Файл подкачки не выключен случаем? Что то странно больно на таких объемах такое поведение.


 
VAleksey ©   (2004-01-05 09:50) [11]

Посмотри в FAQ рекомендации по настройке BDE.


 
Julia   (2004-01-05 09:56) [12]

>Ты их в циклах гоняешь?
Нет никаких циклов. Процесс идет так.
1. выполнила запрос типа:
select sum(b.summa)
from table2 b
2. Подстановка в table1:
table1.Edit
table1.Summa:=SQL.sum(summa)
table1.Post;

Может, ошибка от того, что постоянно идет Edit,Post?

>Может у тебя винда кривая?
Дело в том, что это наблюдается на 2-ух разных компьютерах.


 
Sergey13 ©   (2004-01-05 10:09) [13]

2Julia (05.01.04 09:56) [12]
>Нет никаких циклов. Процесс идет так.
По кнопке? И именно на 16 "срезается"? И как ты там "Чуть подкорректировала запросы"? Секцию "where" в select добавила? Потом, ты же пишешь, что "первоначально и делала в динамике" и только переходишь на апдейты, а тут те-же яйца, только вид с боку. 8-)


 
Julia   (2004-01-05 10:18) [14]

Нет, сейчас (с while not eof- точное описание работы в моем первом вопросе) все идет прекрасно. Только на моем компе со свободными ресурсами -86% идет расчет показателей (1 раз в месяц) в течение 15 минут, а на другом, где оперативка сильно забита и свободных ресурсов 73% расчет идет аж 2 часа. Вот я ищу другое решение и хочу перейти к апдейт. По-моему это корректно.


 
Sergey13 ©   (2004-01-05 10:33) [15]

2Julia (05.01.04 10:18) [14]
Совсем ты меня запутала. 8-)
Каких ресурсов? Нефтяных? И от чего проценты? Где оперативка забита там ее скока? 16М или 256М? Чем забита? Почему нельзя освободить? Какая ОС в конце концов? Какие камни на машинах? Данные по сети гоняются или локально?
Но при самом плохом раскладе 500 записей за 2 часа - это очень долго, ИМХО.


 
paul_k ©   (2004-01-05 10:38) [16]

что надо сделать?
насколько я понял выбрать все записи подчиненной таблицы связанные с записью в главной, проссумировать поле n в подчиненной и записать это значение в поле k главной таблицы?
если так то ответ дан в
Sergey13 © (05.01.04 08:24) [4]
только чуть чуть надо подумать и написать
update table1
set pole_k = (select sum(table2.pole_n) from table2 where table2.kodTable1=table1.kod)
where
тут пишем условия выбора полей из table1


 
Julia   (2004-01-05 10:42) [17]

Ну конечно же системные ресурсы, а не свободные ресурсы, Sergey13. Загляни у себя МОЙ КОМПЬЮТЕР, Свойства, быстродействие и поймешь о чем я. Оперативки и там и у меня 256, windows98.
> Данные по сети гоняются или локально?
Локально
>Но при самом плохом раскладе 500 записей за 2 часа - это очень долго, ИМХО.

В том то все и дело. А освобождать их оперативку не моя проблема. Лучше я от циклов перейду к апдейт. Вот и проблема времени обработки решится. Так-то всяко быстрее. Просто был вопрос, как этот апдейт написать.
Большой привет! 8-)


 
VAleksey ©   (2004-01-05 10:47) [18]


> Julia (05.01.04 10:42) [17]

а запрос типа, будет быстрее работать...
Ну ну..
Не факт.
А ресурсоемкость ;-) от использования запроса возможно и возрастет.


 
Julia   (2004-01-05 10:53) [19]

VAleksey © (05.01.04 10:47) [18]
Update, я думаю, будет быстрее, чем если база будет в цикле While not eof (что я описала в своем вопросе), тем более, что мне таким образом нужно корректировать несколько полей главной базы.


 
Ильш ©   (2004-01-05 11:02) [20]


> Нужно запросом суммировать оплату за услуги по пациенту
> в подчиненной таблице и сумму подставить в главную таблицу.

Эту сумму нужно получать динамически! А с ошибками надо разбираться. Подход предлагаемый тобой соершенно неверен. Кто ж так делает???
Главная проблема может крыться в самом Парадоксе. Тот еще движок :( Может на мыло киданешь базы. Интересно разобраться.


 
Julia   (2004-01-05 11:17) [21]

>Ильш © (05.01.04 11:02) [20]
>Подход предлагаемый тобой соершенно неверен
ПОЧЕМУ???????
Базы скинуть могу. Но что ты в них поймешь? Нужно кидать и все мои запросы.


 
Johnmen ©   (2004-01-05 11:25) [22]

>Julia

А самый главный вопрос - зачем это вообще нужно ? В чём резоны ?


 
Julia   (2004-01-05 11:29) [23]

Уменьшить время обработки. Прочти мой вопрос.


 
Johnmen ©   (2004-01-05 11:41) [24]

Очень сложная обработка ? Очень много записей в таблицах ?

>Прочти мой вопрос

А есть сомнения в том, что прочел ? Тогда - прочел... И там ни слова о том, зачем эта "обработка" вообще нужна...


 
Sandman25 ©   (2004-01-05 11:48) [25]

Я выполнял похожую вещь, с помощью update table1 set field1 = (select sum(amount*price) from table2 where table2.table1_id = table1.id) where id=?
И очень даже быстро работало. Тоже Paradox, правда, D6.


 
Julia   (2004-01-05 11:50) [26]

Прочти paul_k © (05.01.04 10:38) [16]. Он правильно понял и в общем-то я и решила перейти от циклов к update.


 
Sandman25 ©   (2004-01-05 11:54) [27]

[26] Julia (05.01.04 11:50)

Если это мне, то я в курсе. Прсото хотел написать, что дело не в том, что СУБД Paradox, а в настройках компьютера или самой программе.


 
Julia   (2004-01-05 11:58) [28]

>Sandman25 © (05.01.04 11:54) [27]
НЕТ-нет .Это не тебе. Это Johnmen © (05.01.04 11:41) [24]. А тебе Sandman25 большое спасибо за подтверждение моей мысли.


 
Johnmen ©   (2004-01-05 12:01) [29]

>Julia

Девушка, а вы мои посты читаете ? Вопросы уточняющие понимаете ?
Ещё раз. Зачем эта "обработка" вообще нужна ? В принципе ?


 
Julia   (2004-01-05 12:13) [30]

>Johnmen © (05.01.04 12:01) [29]
>Зачем эта "обработка" вообще нужна ? В принципе ?

Выбрать все записи подчиненной таблицы связанные с записью в главной, проссумировать поле n в подчиненной и записать это значение в поле k главной таблицы. А потом я работаю с главной для дальнейших расчетов зарплаты и т.д. и т.п.


 
Johnmen ©   (2004-01-05 12:17) [31]

>Julia

О, Господи ! Да понятно, что вы делаете !!! Я просто поинтересовался - ЗАЧЕМ ??? В ЧЕМ ВЫГОДА ОТ НАЛИЧИЯ СУММЫ В ГЛАВНОЙ ТАБЛИЦЕ ? (в данном конкретном случае...)


 
Julia   (2004-01-05 12:28) [32]

>Johnmen © (05.01.04 12:17) [31]
Прошу прощения, если вывела вас из себя. Все же это интерактивное общение, а не "в живую". Данные ДОЛЖНЫ быть собраны в главной (и не только эти, а многие другие. Они должны находиться в одном месте. Вот и собираю...). Если все понятно, ждем идей.


 
Johnmen ©   (2004-01-05 12:34) [33]

>Julia (05.01.04 12:28)
>Прошу прощения, если вывела вас из себя.

Не удастся :)

По поводу "сборки в одном месте" уже всё сказали.
Но мне интересно, зачем собирать, т.е.хранить, то, что всегда можно получить запросом... Насколько оправдана такая денормализация.


 
Sandman25 ©   (2004-01-05 12:47) [34]

В моем случае суммировались товары покупки и записывались в таблицу покупок. В отчетах, в основном, фигурируют суммы покупок, изменение покупок запрещено, поэтому нет смысла каждый раз устраивать select sum, сумма покупки - статичная информация.
Но подождем автора, у нее, похоже, другая ситуация.


 
Julia   (2004-01-05 12:47) [35]

>Johnmen © (05.01.04 12:34) [33]
Нужно обработать информацию по каждому пациенту (главная база), учитывая оказанные ему услуги (подчиненная таблица) ЗА МЕСЯЦ. И на основании этих данных (и еще многих других) расчитать МЕСЯЧНУЮ з/плату медицинскому персоналу (причем, по бюджету и платно), показатели их работы. Рыться то там, то там затруднительно и практически невыполнимо. Вся информация должна быть в одном месте, чтобы наряд по пациенту имел окончательный вид и был готов к многочисленным расчетам. Запрос не прокатит.
Если есть время и желание, можешь ещё отговаривать меня от идеи хранить в одном месте. Но в данном случае это целесообразно. Жду идей. А в общем-то, идеи уже были.


 
paul_k ©   (2004-01-05 12:49) [36]

2Julia
Если смотреть с точки зрения правильного проектирования БД мой ответ является бредом сивой кобылы.
Вы спросили как сделать фигню - я Вам это сказал. как говорится - какой вопрос, такой ответ.
Но должен добавить, что последующие ораторы абсолютно правы.
нельзя хрранить в главной таблице данные из подчиненных.
простейший пример: "продвинутый" усер через какой нибудь DbExpert грохнул запись в подчиненной. вывод - Ваши данные можно выбросить, или подобное "обновление" главной таблицы надо проводить на каждый просмотр.
То есть если Вы хотите хранить сумму каждого перечня в шапке просто для отображения в списке - это бред. Если Вы храните эту сумму как "контрольную" и рядом отображаете сумму перечня, то может это и имеет некий смысл. Но тогда логичнее хранить все контрольные суммы в отдельной таблице что-бы можно было видеть историю их изменения


 
paul_k ©   (2004-01-05 12:52) [37]

И в продолжение.
Для Вашей задачи , ИМХО, вообще дельфи практически не нужны.
Надо нарисовать красивый отчет в том-же CrystalReporte, например
и передав в отчет к примеру id клиента и период получить красивошную бамажку.


 
Sandman25 ©   (2004-01-05 12:53) [38]

[36] paul_k © (05.01.04 12:49)

О чем Вы говорите, тут ведь Paradox используется. Никаких триггеров, view, разделения прав доступа. А в таком случае с помощью редактирования записей можно добиться чего угодно. Никакая структура БД не защитит от злостных вредителей, изменяющих данные в свою пользу.


 
paul_k ©   (2004-01-05 13:00) [39]

2Sandman25
От злостных - да, а от "продвинутых усеров", которым какой-нить вася показал как данные в табличке править а про наличие связанных таблиц сказать забыл (а таких большинство в конторах сидит, в смысле усеров) вполне поможет. и даже дату правки можно примерно понять
но это было только предположение - зачем подобную сумму хранить


 
Sandman25 ©   (2004-01-05 13:08) [40]

[39] paul_k © (05.01.04 13:00)

Как раз таки против непродвинутых лучше дублировать инфо. Если они исправят сумму только в той ("главной") таблице, по которой идет расчет отчетов, то верные данные можно будет восстановить по "детальной" таблице, найдя суммы заново :)



Страницы: 1 2 вся ветка

Текущий архив: 2004.01.29;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.013 c
7-93712
dron
2003-11-12 12:47
2004.01.29
Как программно создать переменную окружения


3-93387
alextov
2003-12-29 15:28
2004.01.29
При вводе ключевого поля не отображаются некоторые лукапные поля


6-93617
FEV
2003-11-25 09:34
2004.01.29
Подключение к компьютеру по сети


6-93618
Andersen
2003-11-25 16:49
2004.01.29
DNS - сервер


3-93331
paul_k
2003-12-30 09:31
2004.01.29
Совсем запутался c uniqueidentifier.