2012-10-01 11 views
25

Oracle Sqlクエリについて深く知りません。したがって、別の(結合)テーブルのフィールドを含む制約を満たす必要があるテーブルから一部の行を削除する際に問題が発生します。言い換えれば、JOINを含む行を削除するためのクエリを記述したいと思います。Oracle sqlクエリでJoinを使用して削除

私の場合、私はテーブルProductFiltersを持っていて、別のテーブルProductsはフィールドProductFilters.productID = Products.IDに加わっています。私はProductFiltersからID以上の行を200個以上削除したいのですが、それらが参照する製品名は「マーク」(名前は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' 
);  
+0

エラーは何ですか? – davek

+0

はい、結合を使用して削除することができます:http://stackoverflow.com/a/3675205/110933 – davek

答えて

21

を私は上記の私のコメントの中にリンクされている回答に基づいて、この作業をする必要があります:

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' 
) 
); 
+0

私は2番目を試して、私はエラーを受け取ります: "列はあいまいに定義されています"。私は、始まりの正しい構文が削除PRODUCTFILTERSだと思うのだが、どこから削除したのか分からない。 – arjacsoh

+0

OK、入れ子になったROWIDリファレンスに修飾子を追加しました。 – davek

+1

さて、今回は動作します – arjacsoh

48

は最近、私は、次の構文を知った:

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

私はそれが他の提案されたコードをもっときれいに見えると思います。

+0

本当にきれいです。今後これを使用して、他の人が正確に何が削除されているかを理解しやすくなります。 – user2025696

+0

これは**ほとんどが** joinよりむしろwhere条件を通過した選択肢よりもはるかに高速です**。 –

+0

JOINにコレクション(表など)がある場合、PL/SQLコレクションでDMLを実行できないため、エラーが発生します。しかし、良い構文です。 – Alfabravo