Привет всем. :)
Из большой таблички нужно удалить записи по сложному условию.
План для условия вполне нормальный.
Но когда включаешь его в delete выплывает NATURAL.
Есть ли какой-нибудь способ не проходить для этого всю табличку?
Можно конечно преобразовать в execute block, но хотелось бы более
декларативного и стандартного способа.
Может что предполагается в 3-ке или на будущее? :)
Пример запроса на удаление:
delete from SYMP2REMEDS sr
where sr.ID in (
select sr_dst.ID from SYMP2REMEDS sr_dst
inner join SYMP2REMEDS_ORIGIN sro on sro.OBJ_ID = sr_dst.ID
inner join SYMP2REMEDS sr_src on sr_src.ID = sro.ORIGIN_ID
inner join SYMP2REMEDS_ORIGIN sro1 on sro1.OBJ_ID = sr_dst.ID
where sr_dst.SYM_ID = ?--?DST_ID
and sr_src.SYM_ID = ?--?SRC_ID
group by 1
having count (*) = 1
)
План:
PLAN SORT (JOIN (JOIN (SR_DST INDEX (PK_SYMP2REMEDS), SRO INDEX
(FK_SYMP2REMEDS_ORIGIN_OBJ_ID), SRO1 INDEX
(FK_SYMP2REMEDS_ORIGIN_OBJ_ID)), SR_SRC INDEX (PK_SYMP2REMEDS)))
PLAN (SR NATURAL)
Выжимка из табличек:
CREATE TABLE SYMP2REMEDS
(
ID D_BIG_ID,
SYM_ID D_ID,
CONSTRAINT PK_SYMP2REMEDS PRIMARY KEY (ID),
CONSTRAINT FK_SYMP2REMEDS_SYM_ID FOREIGN KEY (SYM_ID) REFERENCES
SYMPTOMS (ID) ON DELETE CASCADE
);
CREATE TABLE SYMP2REMEDS_ORIGIN
(
OBJ_ID D_BIG_ID,
ORIGIN_ID D_BIG_ID,
CONSTRAINT FK_SYMP2REMEDS_ORIGIN_OBJ_ID
FOREIGN KEY (OBJ_ID) REFERENCES SYMP2REMEDS (ID) ON DELETE CASCADE;
CONSTRAINT FK_SYMP2REMEDS_ORIGIN_ORIGIN_ID
FOREIGN KEY (ORIGIN_ID) REFERENCES SYMP2REMEDS (ID) ON DELETE CASCADE;
);
--
Александр Замараев