Partage
  • Partager sur Facebook
  • Partager sur Twitter

requete DELETE avec jointure

Anonyme
6 juin 2017 à 10:40:12

Bonjour, j'ai un problème avec une requête de suppression, je veux supprimer des lignes dans une table grâce à une donnée dans une autre table donc via une jointure.

la requete :

DELETE FROM PARTICIPANT p WHERE p.num_participant IN(SELECT pa.NUM_PARTICIPANT FROM PARTICIPER pa WHERE pa.NUM_AUDIT=5)

(j'ai mis 5 pour l'exemple mais normalement ça sera '?' )

ça me met une erreur de syntaxe sans précision supplémentaire, j'ai pas mal fouiller sur le forum les requêtes d'autre personne pour m'inspirer mais ça ne fonctionne toujours pas ça fait une semaine ça me rend fou donc si vous avez une idée ça serait super !

Merci d'avance

  • Partager sur Facebook
  • Partager sur Twitter
6 juin 2017 à 11:05:54

DELETE p 
FROM   participant p 
       INNER JOIN participer pa 
               ON p.num_participant = pa.num_participant 
WHERE  pa.num_audit = 5 
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
6 juin 2017 à 13:12:02

je viens de test ça marche pas j'avais déjà essayé je crois :/

erreur : 

-
Edité par Anonyme 6 juin 2017 à 13:16:30

  • Partager sur Facebook
  • Partager sur Twitter
6 juin 2017 à 13:25:42

DELETE p
-- et pas
DELETE
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
6 juin 2017 à 13:36:43

J'ai fait les deux ça marchait pas et SQl me disait d'enlever le p c'est pour ça ^^'

-
Edité par Anonyme 6 juin 2017 à 13:46:14

  • Partager sur Facebook
  • Partager sur Twitter
6 juin 2017 à 14:05:16

De toute facon, ta requete initiale (meme si pas jolie), semble correcte.

Tu peux nous dire a quoi ressemble tes 2 tables participant et participer ? Tes colonnes etc...

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
6 juin 2017 à 14:18:30

Participant : 

 - num_Participant

 - num_Structure

 - nom_Participant

 -Prenom_Participant

clé primaire : num_participant

clé etrangere : num_structure

 -

 -

Participer :

 - num_Participant

 - num_Audit

clé composé des deux champs

-
Edité par Anonyme 6 juin 2017 à 14:19:15

  • Partager sur Facebook
  • Partager sur Twitter
6 juin 2017 à 14:27:15

Bon, bah la requête que je t'ai donné en sensé fonctionner. Le soucis doit venir d'ailleurs.

Qu'est-ce que ca donne quand tu fais un select ou un update, ca passe bien ?

Si tu fais un delete mais sans jointure, ca donne quoi ?

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
6 juin 2017 à 14:39:03

Alors en remplacant DELETE p par SELECT * ça fonctionne ça me retourne la ligne que j'ai rentré pour faire mes tests

DELETE p FROM PARTICIPANT p

ça ça ne fonctionne pas ça me dit que y a une erreur dans le code

Par contre je viens de trouver un truc c'est quand je fais :

DELETE FROM PARTICIPANT

il me dit que c'est impossible car la clé primaire est utilisé ailleurs (donc dans PARTICIPER) mais avec la jointure ça me disait erreur de syntaxe 

mais alors je ne vois pas comment faire car j'ai besoin de la valeur NUM_AUDIT de PARTICIPER pour supprimer dans PARTICIPANT mais en meme temps il faut supprimer dans PARTICIPER avant ? 



  • Partager sur Facebook
  • Partager sur Twitter
6 juin 2017 à 14:46:42

C'est le principe des contraintes d'intégrités. Si tu supprimes une ligne dans "participant", il faut obligatoirement que ce participant ne soit utilisé nul par ailleurs dans ta BDD (notamment dans ta table "participer"), donc tu peux soit procéder en stockant tes ID dans une table temporaire à l'aide d'un SELECT, ensuite purger ta table "participer", puis ta table "participant".

Sinon, plus simple (mais je peux pas plus d'aider que ca la dedans car je pourrais dire des conneries), c'est de fonctionner avec des "ON DELETE CASCADE" qui est une option de FK. Pour le coup, faudra fouiller sur google pour voir le fonctionnement et la paramétrage car je maîtrise pas à fond, ou attendre que qqn qui maîtrise mieux que moi passe par ici.

Mis à part ca, je ne comprends pas pourquoi dès que tu poses un ALIAS, ton DELETE plante. Pour avoir faire des centaines de DELETE de cette manière, je vois pas ou se trouve le bug....

EDIT : sinon, est-ce qu'il y a réellement une utilité à supprimer ta ligne dans "participant" ? Supprimer ta ligne dans "participer" n'est pas suffisant ?

-
Edité par Tiffado 6 juin 2017 à 14:48:20

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
6 juin 2017 à 15:06:39

J'ai trouvé une solution par rapport ace que tu m'as dit, j'ai récupéré le num_edit dans une variable, j'ai fait un select dans posseder en mettant un WHERE num_edit = maVariable

et avec un foreach(maRequete AS var) j'ai fait un delete dans participant avec un num_participant=var['num_participant']

je sais pas si c'est clair mais comme ça ça marche :)

merci beaucoup de ton aide !

  • Partager sur Facebook
  • Partager sur Twitter
6 juin 2017 à 15:19:20

Ça a l'avantage de marcher, mais c'est pas beau :/

Faire des requêtes dans une boucle, c'est moche, c'est pas optimisé du tout, c'est à éviter autant que possible.

  • Partager sur Facebook
  • Partager sur Twitter
14 septembre 2020 à 10:39:56

Bonjour,

l'utilisation des jointures avec un delete n'est pas standart !!

  • Partager sur Facebook
  • Partager sur Twitter
14 septembre 2020 à 11:19:09

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL