Si ta version de Mysql est inférieure à 4.1, alors elle ne supporte pas les requêtes imbriquées il faudra mettre à jour Mysql au delà de la version 4.1.
Mais, il y a un problème dans ta requête :
DELETE FROM table1 WHERE No_Annonce IN (SELECT distinct table1.No_Annonce FROM table1 LEFT JOIN table2 ON table1.No_Annonce=table2.No_Annonce WHERE table2.No_Annonce IS NULL )
Car tu n'as pas besoin de faire un join si tu utilise déjà la méthode IN. Je t'explique:
Selon l'algèbre relationnelle, il y a deux méthodes pour représenter une jointure (intersection):
1. La méthode ensembliste : où l'on réalise l'intersection entre deux ensembles (SELECT) par l'opérateur IN.
Exemple:
Code : Tout sélectionner
SELECT ref, designation FROM article Where ref IN (SELECT distinct ref FROM commande WHERE id_client = 'toto')
Permet de faire une jointure ensembliste entre les articles et les commandes du client 'toto', ce qui fait que cette requête sélectionne simplement les articles qui ont été commandés par le client 'toto'.
Cette méthode produit donc une forme de Requêtes imbriquées.
2. Par contre, on peut faire la même chose en utilisant la méthode relationnelle dite "Méthode prédicatives" où l'on formule l'intersection entre deux tables non pas par des SELECT imbriqués mais par jointures des tables impliquées dans un seul et même SELECT en utilisant les liens prédéfinis entre les tables dans le modèle relationnel (clé primaire=clé étrangère ou lien entre des index identiques)
On utilise pour ça l'opérateur JOIN ... ON ... (qui est une jointure naturelle).
Et notre exemple devient :
Code : Tout sélectionner
SELECT a.ref, a.designation FROM article AS a JOIN commande AS c ON a.ref=c.ref
WHERE c.id_client = 'toto')
Cette forme est la meilleure qui reste fidèle au modèle relationnelle, et n'engendre pas d'imbrication de requêtes.
Donc, tu ne dois pas mélanger les deux méthodes, surtout appliquées aux mêmes tables.
Ta requête peut alors s'écrire soit :
1. Ensembliste:
Code : Tout sélectionner
DELETE FROM table1 WHERE No_Annonce NOT IN (SELECT distinct No_Annonce FROM table2)
ou bien:
2. Prédicative:
Code : Tout sélectionner
DELETE FROM table1 LEFT JOIN table2 ON table1.No_Annonce=table2.No_Annonce WHERE table2.No_Annonce IS NULL
A+