Удаление по сложному условию

2011-06-14 Пенетрантность Tonal
Привет всем. :)

Из большой таблички нужно удалить записи по сложному условию.
План для условия вполне нормальный.
Но когда включаешь его в 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;
);
-- 
Александр Замараев



Re: Удаление по сложному условию

2011-06-14 Пенетрантность Sergey Mereutsa
Привет!

 Из большой таблички нужно удалить записи по сложному условию.
 План для условия вполне нормальный.
 Но когда включаешь его в delete выплывает NATURAL.

А for select по условию без натурала с выборкой rdb$db_key и удалением
по нему не спасает?

Правда, позиционирование по rdb$db_key считается натуралом, но на это
можно не обращать внимания :)


-- 
Best regards,
 Sergeymailto:gebele...@gmail.com




Re: Удаление по сложному условию

2011-06-14 Пенетрантность Tonal
14.06.2011 17:26, Sergey Mereutsa пишет:
 А for select по условию без натурала с выборкой rdb$db_key и удалением
 по нему не спасает?
for select - это уже execute block или сохранёнка.
А хотелось бы одним delete обойтись.

Вроде бы стандартная ситуация и оптимизатор мог бы сам преобразовать в
соответствующий for select...
-- 
Александр Замараев