Эффективный запрос на удаление записей на основе нескольких условий

У меня есть таблица, как показано ниже:

CREATE TABLE product
(
  PRODUCT   NVARCHAR2(20)                       NOT NULL,
  TYPE   NUMBER(5)                           NOT NULL,
  ID     NUMBER(10)                          NOT NULL,
  addDATE    DATE                                NOT NULL,
  TITLE     NVARCHAR2(80)                       NOT NULL
)

Мне нужно удалить записи из таблицы на основе типа столбца и addDate. Существует 40 типов продуктов, и каждый продукт имеет разные критерии удаления. Ниже приведен запрос, который я сейчас использую;

DELETE from PRODUCT where 
(type =1 and trunc(ADDdate) <  add_months( sysdate, -24 ))
OR 
(type =2 and trunc(ADDdate) <  add_months( sysdate, -12 ))
OR 
(type =3 and trunc(ADDdate) <  add_months( sysdate, 12 ))
.
..
.
.
OR 
(type =49 and trunc(ADDdate) <  add_months( sysdate, 1 ));

Не могли бы вы предложить мне эффективный способ реализации этого запроса, кроме вышеупомянутого.


person user2077648    schedule 15.11.2015    source источник
comment
Во-первых, я удалил тег mysql, потому что синтаксис явно Oracle. Во-вторых, у вас должны быть критерии удаления в таблице. Пожалуйста, покажите эту таблицу в вопросе.   -  person Gordon Linoff    schedule 15.11.2015
comment
Я уже упоминал, что записи должны быть удалены на основе условия where в запросе на удаление. Мой вопрос в том, есть ли другой эффективный способ написать условие where?   -  person user2077648    schedule 15.11.2015
comment
@user2077648 user2077648 Определите эффективный. Если вы ищете самый простой синтаксис, то ответ Гордона, вероятно, лучший. Если вы ищете лучшую производительность, то то, что у вас есть, вероятно, лучшее.   -  person Jon Heller    schedule 15.11.2015


Ответы (1)


У вас должна быть таблица с критериями удаления. . . что выглядит как несколько месяцев. Следовательно:

delete from product
    where trunc(AddDate) < (select add_months(sysdate, dtt.deletionmonths)
                            from DeleteTypeTable dtt
                            where dtt.type = product.type
                           );
person Gordon Linoff    schedule 15.11.2015
comment
Итак, здесь необходимо создать отдельную таблицу DeleteTypeTable с типом столбцов и месяцами удаления? - person user2077648; 15.11.2015
comment
@user2077648 . . . Если у вас есть тип, у вас должна быть справочная таблица, которая его описывает. - person Gordon Linoff; 15.11.2015
comment
да, таблица есть, но в ней нет столбца deletionmonths, поэтому это решение включает изменение структуры таблицы. Есть ли что-нибудь еще, что вы можете предложить, что не связано с добавлением дополнительного столбца deletionmonths в справочную таблицу? - person user2077648; 15.11.2015
comment
@user2077648 . . . Помещение этой информации в таблицы type кажется правильным решением. Гораздо лучше иметь информацию в справочной таблице, чем каким-то образом встроенную в код. - person Gordon Linoff; 16.11.2015