Почему виснет ? :(
Почему виснет ? :(
Хай All
Вот этот запросец выыполняется 16 секунтд
FOR SELECT DISTINCT i.id, i.TO_ID, i.USER_ID, i.DOC_TYPE, cast((i.doc_sum*i.currency_value) as numeric(16,2)) r_sum, cast(ot.DOC_SUM as numeric(16,2)), ot.THE_DATE, cast(opl.DOC_SUM as numeric(16,2)), opl.THE_DATE, c.name, i.DOC_NO, i.THE_DATE, i.CURRENCY_ID, i.CURRENCY_VALUE
FROM invoices i, pid p, GET_DOC_SUM_SEB ot, GET_DOC_SUM_SEB_OPL opl, customer c
WHERE i.interval_id <> 9000
AND i.doc_type in (1, 5, 11)
AND ot.PARENT_ID=i.id
AND i.CURRENCY_ID = 1
AND opl.PARENT_ID=i.id
AND p.pid=i.id
AND c.id = i.RESPONSIBLE_ID
AND i.from_id in (SELECT id FROM customer WHERE type_id=1 AND firm = :firm)
но если добавить хотя бы and i.id>0 висим без всяких признаков жизни
Вот этот запросец выыполняется 16 секунтд
FOR SELECT DISTINCT i.id, i.TO_ID, i.USER_ID, i.DOC_TYPE, cast((i.doc_sum*i.currency_value) as numeric(16,2)) r_sum, cast(ot.DOC_SUM as numeric(16,2)), ot.THE_DATE, cast(opl.DOC_SUM as numeric(16,2)), opl.THE_DATE, c.name, i.DOC_NO, i.THE_DATE, i.CURRENCY_ID, i.CURRENCY_VALUE
FROM invoices i, pid p, GET_DOC_SUM_SEB ot, GET_DOC_SUM_SEB_OPL opl, customer c
WHERE i.interval_id <> 9000
AND i.doc_type in (1, 5, 11)
AND ot.PARENT_ID=i.id
AND i.CURRENCY_ID = 1
AND opl.PARENT_ID=i.id
AND p.pid=i.id
AND c.id = i.RESPONSIBLE_ID
AND i.from_id in (SELECT id FROM customer WHERE type_id=1 AND firm = :firm)
но если добавить хотя бы and i.id>0 висим без всяких признаков жизни
Сервер полторушный
Скажем так проблема в том что ,вообще заджоинить мне надо вот эту вещь GET_DOC_SUM_SEB_OPL по parent_id
пишу
FOR SELECT DISTINCT i.id, i.TO_ID, i.USER_ID, i.DOC_TYPE, cast((i.doc_sum*i.currency_value) as numeric(16,2)) r_sum, cast(ot.DOC_SUM as numeric(16,2)), ot.THE_DATE, cast(opl.DOC_SUM as numeric(16,2)), opl.THE_DATE, c.name, i.DOC_NO, i.THE_DATE, i.CURRENCY_ID, i.CURRENCY_VALUE
FROM invoices i left join GET_DOC_SUM_SEB_OPL opl on (opl.parent_id=i.id) , pid p, GET_DOC_SUM_SEB ot, customer c
WHERE i.interval_id <> 9000
AND i.doc_type in (1, 5, 11)
AND ot.PARENT_ID=i.id
AND i.CURRENCY_ID = 1
AND p.pid=i.id
AND c.id = i.RESPONSIBLE_ID
AND i.from_id in (SELECT id FROM customer WHERE type_id=1 AND firm = :firm)
результат - виснет хотя если просто i.id=opl.parent_id и убрать джоин
, то всё нормально но мне нужен именно лефт джоин ,
мне нужны пустые суммы
Скажем так проблема в том что ,вообще заджоинить мне надо вот эту вещь GET_DOC_SUM_SEB_OPL по parent_id
пишу
FOR SELECT DISTINCT i.id, i.TO_ID, i.USER_ID, i.DOC_TYPE, cast((i.doc_sum*i.currency_value) as numeric(16,2)) r_sum, cast(ot.DOC_SUM as numeric(16,2)), ot.THE_DATE, cast(opl.DOC_SUM as numeric(16,2)), opl.THE_DATE, c.name, i.DOC_NO, i.THE_DATE, i.CURRENCY_ID, i.CURRENCY_VALUE
FROM invoices i left join GET_DOC_SUM_SEB_OPL opl on (opl.parent_id=i.id) , pid p, GET_DOC_SUM_SEB ot, customer c
WHERE i.interval_id <> 9000
AND i.doc_type in (1, 5, 11)
AND ot.PARENT_ID=i.id
AND i.CURRENCY_ID = 1
AND p.pid=i.id
AND c.id = i.RESPONSIBLE_ID
AND i.from_id in (SELECT id FROM customer WHERE type_id=1 AND firm = :firm)
результат - виснет хотя если просто i.id=opl.parent_id и убрать джоин
, то всё нормально но мне нужен именно лефт джоин ,
мне нужны пустые суммы
Переписал , как правильно , всё равно при добавлении invoices i left join GET_DOC_SUM_SEB_OPL OPL on (i.id=OPL.parent_id) вместо and i.id=OPL.parent_id висит
SELECT DISTINCT i.id, i.TO_ID, i.USER_ID, i.DOC_TYPE, cast((i.doc_sum*i.currency_value) as numeric(16,2)) r_sum, cast(ot.DOC_SUM as numeric(16,2)), ot.THE_DATE, cast(opl.DOC_SUM as numeric(16,2)), opl.THE_DATE, resp.name, i.DOC_NO, i.THE_DATE, i.CURRENCY_ID, i.CURRENCY_VALUE
FROM invoices i left join GET_DOC_SUM_SEB_OPL OPL on (i.id=OPL.parent_id), pid p, GET_DOC_SUM_SEB ot, customer resp,customer post
WHERE i.interval_id <> 9000
AND i.doc_type in (1, 5, 11)
AND ot.PARENT_ID=i.id
AND i.CURRENCY_ID = 1
AND p.pid=i.id
AND i.RESPONSIBLE_ID=resp.id
AND i.from_id=post.id and post.type_id=1 AND post.firm = :firm
что на это скажете ?
самое главное в том что мне надо, по каким документам не было проплат или суммы не сходятся , GET_DOC_SUM_SEB_OPL возвращает родителей проплаченных документов
SELECT DISTINCT i.id, i.TO_ID, i.USER_ID, i.DOC_TYPE, cast((i.doc_sum*i.currency_value) as numeric(16,2)) r_sum, cast(ot.DOC_SUM as numeric(16,2)), ot.THE_DATE, cast(opl.DOC_SUM as numeric(16,2)), opl.THE_DATE, resp.name, i.DOC_NO, i.THE_DATE, i.CURRENCY_ID, i.CURRENCY_VALUE
FROM invoices i left join GET_DOC_SUM_SEB_OPL OPL on (i.id=OPL.parent_id), pid p, GET_DOC_SUM_SEB ot, customer resp,customer post
WHERE i.interval_id <> 9000
AND i.doc_type in (1, 5, 11)
AND ot.PARENT_ID=i.id
AND i.CURRENCY_ID = 1
AND p.pid=i.id
AND i.RESPONSIBLE_ID=resp.id
AND i.from_id=post.id and post.type_id=1 AND post.firm = :firm
что на это скажете ?
самое главное в том что мне надо, по каким документам не было проплат или суммы не сходятся , GET_DOC_SUM_SEB_OPL возвращает родителей проплаченных документов
ты лучше вот эту гадость перепиши
нельзя мешать в кучу явные и неявные join. написал left join, будь добер все остальные таблицы объединить тоже явно по join.
Код: Выделить всё
FROM invoices i left join GET_DOC_SUM_SEB_OPL OPL on (i.id=OPL.parent_id), pid p, GET_DOC_SUM_SEB ot, customer resp,customer post