Page 1 sur 1

DELETE+JOIN

Posté : 19 déc. 2005, 18:03
par pandipanda
je cherche a nettoyer une table products des tuple qui non aps de concordance dans une table liée products_description , voici ma requete select qui me renvoie les tuples orphelins masi comment faire pour transformer ce select en delet ???

Code : Tout sélectionner

SELECT * FROM products LEFT JOIN products_description ON products_description.products_id = products.products_id WHERE products_description.products_id IS NULL

Posté : 19 déc. 2005, 18:35
par Cyrano
Quel SGBD et quelle version ?

Posté : 19 déc. 2005, 21:20
par pandipanda
mysql 4.1 :)

Posté : 19 déc. 2005, 21:46
par Cyrano
Alors tu devrais pouvoir faire une requête imbriquée du style

Code : Tout sélectionner

DELETE FROM table WHERE champ IN (SELECT etc...)

Posté : 19 déc. 2005, 22:22
par pascaltje
et ça ?

Code : Tout sélectionner

DELETE FROM products LEFT JOIN products_description ON products_description.products_id = products.products_id WHERE products_description.products_id IS NULL
A+

Pascal

Posté : 20 déc. 2005, 10:35
par pandipanda
J'ai donc essayé :

requête SQL:

Code : Tout sélectionner

DELETE FROM products WHERE products.products_id IN ( SELECT products.products_id FROM products LEFT JOIN products_description ON products_description.products_id = products.products_id WHERE products_description.products_id IS NULL )
MySQL a répondu:

#1093 - You can't specify target table 'products' for update in FROM clause

idem pour

requête SQL:

Code : Tout sélectionner

DELETE FROM products LEFT JOIN products_description ON products_description.products_id = products.products_id WHERE products_description.products_id IS NULL MySQL a répondu:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LEFT JOIN products_description

Posté : 23 déc. 2005, 02:16
par HR
Tu ne peux pas utiliser de LEFT JOIN directement avec DELETE, mais tu dois pouvoir utiliser une table dérivée avec un DELETE multi-table comme ça:

Code : Tout sélectionner

DELETE p.* FROM ( SELECT products.products_id FROM products LEFT JOIN products_description USING (products_id) WHERE products_description.products_id IS NULL ) AS p2, products p WHERE p.products_id = p2.products_id