Подтвердить что ты не робот

Удалить с помощью "Присоединиться" в Oracle sql Query

Я не очень хорошо знаком с Oracle Sql Queries, поэтому мне приходится сталкиваться с проблемой удаления некоторых строк из таблицы, которая должна выполнять ограничение, которое включает в себя поля другой (присоединения) таблицы. Другими словами, я хочу написать запрос для удаления строк, включая JOIN.

В моем случае у меня есть таблица ProductFilters, а другая таблица Products связана с полями ProductFilters.productID = Products.ID. Я хочу удалить строки из ProductFilters с ID выше или равным 200, а продукт, на который они ссылаются, имеет имя "Mark" (имя - это поле в Product).

Я хотел бы получить информацию изначально, если JOIN является приемлемым в Delete Query в Oracle. Если нет, как мне изменить этот запрос, чтобы он работал, поскольку в этой форме я получаю сообщение об ошибке:

DELETE From PRODUCTFILTERS pf 
where pf.id>=200 
And pf.rowid in 
(
     Select rowid from PRODUCTFILTERS 
     inner join PRODUCTS on PRODUCTFILTERS.PRODUCTID = PRODUCTS.ID 
     And PRODUCTS.NAME= 'Mark'
);       
4b9b3361

Ответ 1

Основываясь на ответе, о котором я говорил в своем комментарии выше, это должно работать:

delete from
(
select pf.* From PRODUCTFILTERS pf 
where pf.id>=200 
And pf.rowid in 
  (
     Select rowid from PRODUCTFILTERS 
     inner join PRODUCTS on PRODUCTFILTERS.PRODUCTID = PRODUCTS.ID 
     And PRODUCTS.NAME= 'Mark'
  )
); 

или

delete from PRODUCTFILTERS where rowid in
(
select pf.rowid From PRODUCTFILTERS pf 
where pf.id>=200 
And pf.rowid in 
  (
     Select PRODUCTFILTERS.rowid from PRODUCTFILTERS 
     inner join PRODUCTS on PRODUCTFILTERS.PRODUCTID = PRODUCTS.ID 
     And PRODUCTS.NAME= 'Mark'
  )
); 

Ответ 2

Недавно я узнал о следующем синтаксисе:

DELETE (SELECT *
        FROM productfilters pf
        INNER JOIN product pr
            ON pf.productid = pr.id
        WHERE pf.id >= 200
            AND pr.NAME = 'MARK')

Я думаю, что он выглядит намного чище, чем другой предлагаемый код.