web-dev-qa-db-fra.com

Supprimer avec "Rejoindre" dans Oracle sql Query

Je ne connais pas très bien Oracle Sql Queries. Je suis donc confronté à un problème de suppression de lignes d'une table qui doit répondre à une contrainte qui inclut les champs d'une autre table (jointe). En d'autres termes, je veux écrire une requête pour supprimer des lignes, y compris JOIN.

Dans mon cas, j'ai une table ProductFilters et une autre table Products jointes sur des champs ProductFilters.productID = Products.ID. Je veux supprimer les lignes de ProductFilters ayant un ID supérieur ou égal à 200 et le produit auquel elles se réfèrent s'appelle 'Mark' (le nom est un champ dans Product).

J'aimerais d'abord savoir si JOIN est acceptable dans une requête de suppression dans Oracle. Sinon, comment dois-je modifier cette requête afin de la faire fonctionner, car sur ce formulaire je reçois une erreur:

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

D'après la réponse que j'ai liée dans mon commentaire ci-dessus, cela devrait fonctionner:

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

ou

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

Récemment, j'ai appris la syntaxe suivante:

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

Je pense que cela a l'air beaucoup plus propre que les autres codes proposés.

61
xlogic