web-dev-qa-db-ja.com

Oracle SQLクエリの「結合」で削除

私はOracle Sqlクエリに精通していないため、別の(結合)テーブルのフィールドを含む制約を満たす必要があるテーブルからいくつかの行を削除する際に問題に直面しています。つまり、JOINを含む行を削除するクエリを作成します。

私の場合、テーブルProductFiltersと別のテーブルProductsがフィールドProductFilters.productID = Products.IDで結合されています。 200以上のProductFiltersを持つIDから行を削除し、それらが参照する製品の名前が 'Mark'である(名前はProductのフィールドです)。

Oracleの削除クエリでJOINが受け入れられるかどうかを最初に通知したいと思います。そうでない場合は、このフォームでエラーが発生するため、このクエリを機能させるためにどのように変更する必要がありますか?

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'
);       
38
arjacsoh

上記のコメントでリンクした回答に基づいて、これは機能するはずです:

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'
  )
); 
33
davek

最近、次の構文について学びました。

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

他の提案されたコードよりもずっときれいに見えると思います。

61
xlogic