Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.07.01;
Скачать: [xml.tar.bz2];

Вниз

внутренний массив или последовательный перебор в ХП   Найти похожие ветки 

 
Megabyte ©   (2007-04-04 17:27) [0]

Суть:
Мне требуется сделать выборку с условием по агрегатному полю.
select count(distinct Rs.usn), P.responsible_personal_id
from repair_progress P join repair_progress R on R.repair_id = P.repair_id and
   R.repair_progress_id > P.repair_progress_id
   join repairs Rs on Rs.repair_id = P.repair_id
where (P.is_delete > 0) and (R.is_delete > 0) and (P.repair_state_id = 9) and
(R.repair_progress_id between 401001 and 484366) and (R.repair_state_id in (11, 25))
and (R.repair_progress_id - P.repair_progress_id < 10000) and (Rs.repair_result_id = 6000) and
(P.repair_progress_id = (
   select max(Sr.repair_progress_id)
   from repair_progress Sr
   where (Sr.is_delete > 0) and (R.repair_progress_id - Sr.repair_progress_id < 9000)
   and (Sr.repair_id = R.repair_id) and (Sr.repair_state_id = 9)
   and (R.repair_progress_id > Sr.repair_progress_id) ) )
group by P.responsible_personal_id
having Count(distinct P.repair_progress_id) > 600

После мне надо выбрать уже детальную информацию для группирующего поля(P.responsible_personal_id), которое попало в предыдущую выборку.
for select distinct P.repair_id, L.personal_title
from repair_progress P join repair_progress R on R.repair_id = P.repair_id and
   R.repair_progress_id > P.repair_progress_id
   join personal L on P.responsible_personal_id = L.personal_id
   join repairs Rs on Rs.repair_id = P.repair_id
where (P.is_delete > 0) and (R.is_delete > 0) and (P.repair_state_id = 9) and
(R.repair_progress_id between 401001 and 484366) and (R.repair_state_id in (11, 25))
and (R.repair_progress_id - P.repair_progress_id < 9000) and (Rs.repair_result_id = 6000) and
(P.responsible_personal_id = :operator_id) and
(P.repair_progress_id = (
   select max(Sr.repair_progress_id)
   from repair_progress Sr
   where (Sr.is_delete > 0) and (R.repair_progress_id - Sr.repair_progress_id < 9000)
   and (Sr.repair_id = R.repair_id) and (Sr.repair_state_id = 9)
   and (R.repair_progress_id > Sr.repair_progress_id) ) )

Хочу все это сделать в ХП, т.к. есть параметры.
Когда 1-й запрос выдает одну запись, то все просто работает через внутренние параметры. А если записей несколько, то возможно как-то в одной ХП организовать для каждой из записей 1-го запроса выборку во 2-м запросе?
Использовать 1-й запрос как подзапрос для выбора P.responsible_personal_id нельзя, т.к. там группировка, т.е. 2 поля, а не одно выбирается, а без группировки не будет работать условие HAVING BY.

Надеюсь, понятно объяснил, что требуется.


 
Megabyte ©   (2007-04-04 17:28) [1]

Не суть важно, но в 1-м запросе в селекте так нагляднее:
select count(distinct P.repair_progress_id), P.responsible_personal_id


 
Megabyte ©   (2007-04-04 17:30) [2]

Извиняюсь, не HAVING BY, а просто HAVING


 
Desdechado ©   (2007-04-04 17:30) [3]

FOR SELECT
?


 
Megabyte ©   (2007-04-04 17:40) [4]

Смотри:
for select count(distinct Rs.usn), P.responsible_personal_id
from repair_progress P join repair_progress R on R.repair_id = P.repair_id and
   R.repair_progress_id > P.repair_progress_id
   join repairs Rs on Rs.repair_id = P.repair_id
where (P.is_delete > 0) and (R.is_delete > 0) and (P.repair_state_id = 9) and
(R.repair_progress_id between 401001 and 484366) and (R.repair_state_id in (11, 25))
and (R.repair_progress_id - P.repair_progress_id < 10000) and (Rs.repair_result_id = 6000) and
(P.repair_progress_id = (
   select max(Sr.repair_progress_id)
   from repair_progress Sr
   where (Sr.is_delete > 0) and (R.repair_progress_id - Sr.repair_progress_id < 9000)
   and (Sr.repair_id = R.repair_id) and (Sr.repair_state_id = 9)
   and (R.repair_progress_id > Sr.repair_progress_id) ) )
group by P.responsible_personal_id
having Count(distinct P.repair_progress_id) > 600

into :kolvo, :operator_id;

for select distinct P.repair_id, L.personal_title
from repair_progress P join repair_progress R on R.repair_id = P.repair_id and
   R.repair_progress_id > P.repair_progress_id
   join personal L on P.responsible_personal_id = L.personal_id
   join repairs Rs on Rs.repair_id = P.repair_id
where (P.is_delete > 0) and (R.is_delete > 0) and (P.repair_state_id = 9) and
(R.repair_progress_id between 401001 and 484366) and (R.repair_state_id in (11, 25))
and (R.repair_progress_id - P.repair_progress_id < 9000) and (Rs.repair_result_id = 6000) and
(P.responsible_personal_id = :operator_id) and
(P.repair_progress_id = (
   select max(Sr.repair_progress_id)
   from repair_progress Sr
   where (Sr.is_delete > 0) and (R.repair_progress_id - Sr.repair_progress_id < 9000)
   and (Sr.repair_id = R.repair_id) and (Sr.repair_state_id = 9)
   and (R.repair_progress_id > Sr.repair_progress_id) ) )

   into :usn, :operator
   do
       suspend;

Так работать не будет. Без ";" после into :kolvo, :operator_id тоже будет ругаться на 2-й FOR SELECT


 
Desdechado ©   (2007-04-04 17:51) [5]

Синтаксис изучить ломает?
Это ж цикл. Выводы сделай.


 
Megabyte ©   (2007-04-05 09:31) [6]


> Desdechado ©  (04.04.07 17:51) [5]

Синтаксис изучить ломает?
Это ж цикл. Выводы сделай.

Тьфу, простите, забыл(проглядел) DO для 1-го внешнего цикла...



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

Форум: "Базы";
Текущий архив: 2007.07.01;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.005 c
3-1175625608
Hydroliskus
2007-04-03 22:40
2007.07.01
BDE выдает ошибку row fetch limit exceeded


3-1175712325
Seme
2007-04-04 22:45
2007.07.01
Не могу подключиться к MySQL.


3-1175602533
Gringoire
2007-04-03 16:15
2007.07.01
Выбор и отображение записей через BDE и Query


2-1181220749
voe
2007-06-07 16:52
2007.07.01
DBF и пароль


2-1181287268
fisherman
2007-06-08 11:21
2007.07.01
Вопрос по СОМ объектам...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский