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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.023 c
15-1180605999
NailMan
2007-05-31 14:06
2007.07.01
Нужен совет электронщиков


3-1175689951
Ega23
2007-04-04 16:32
2007.07.01
Посмотреть связи по таблице


2-1181210287
StriderMan
2007-06-07 13:58
2007.07.01
Чайниковский вопрос: эмуляция нажатия клавиш


15-1180793705
@!!ex_
2007-06-02 18:15
2007.07.01
Вопрос про динамические массивы и указатели.


1-1178179727
Novice
2007-05-03 12:08
2007.07.01
Алгоритм нечеткого сравнения файлов