Форум: "Базы";
Текущий архив: 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