SQL supprimer des données d'une table en fonction d'une autre

SQL supprimer des données d'une table en fonction d'une autre - SQL/NoSQL - Programmation

Marsh Posté le 22-08-2003 à 18:01:33    

Bonjour,
J'ai une table1 dans laquelle il y a un champ1 que je veux comparer avec le champ1 de la table2.
Si la valeur de table1.champ1 n'existe pas dans table2.champ1 alors je veux detruire l'enregistrement de la table 1.
Ca a pas l'air complique mais ca fait un moment que je bloque et la je sature alors si vous avez des idees sauvez moi!
 

Reply

Marsh Posté le 22-08-2003 à 18:01:33   

Reply

Marsh Posté le 22-08-2003 à 18:41:13    

Reply

Marsh Posté le 22-08-2003 à 19:03:03    

merci mais j'avais deja jeté un coup d'oeil dessus et quand je m'en inspire c'est pas top!
Avant de faire DELETE j'essaie deja avec select ce qui donne:
 
select * WHERE NOT EXISTS (SELECT champ1 FROM table1,table2 WHERE table1.champ1= table2.champ1)
 
bon je sais c pas ca mais j'arrive pas a la formaliser du coup j'ai essaye plus simple avec IN
select champ1 from table1 (NOT IN (SELECT champ1 FROM table2))
 
mais ca marche pas non plus,
bref je tourne autour du pot et je vois des selct en trop partout qui s'integre jamais comme je voudrais.

Reply

Marsh Posté le 22-08-2003 à 19:11:30    

Je crois qu'il faudrait que tu t'achète un bouquin de SQL ou que tu prenne des cours, c'est vraiment le B A BA là :/
 

DELETE FROM table1  
WHERE champ1 NOT IN (SELECT champ1 FROM table2)


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

Marsh Posté le 22-08-2003 à 19:26:33    

Sinon, quel est ton SGBD ?
 
Si tu as MySQL version avant la 1.4, laisse tomber, il ne supporte pas les sous-requêtes

Reply

Marsh Posté le 22-08-2003 à 19:51:31    

Merci mais la je crois que c'est ma tete qui doit pas tourner rond. J'ai Easyphp 1.6 donc je pense que la version de Mysql est suffisament recente pour pouvoir accépter les requêtes imbriquées. Pourtant meme la requete la plus simple du monde, j'ai nommé:
DELETE FROM table1  
WHERE champ1 NOT IN (SELECT champ1 FROM table2)
 
il en veut pas. J'ai decomposé apparement il bloque sur le IN et j'arrive pas a le trouver dans la doc! Ca me fait chier parce que cette table trop remplie (65000 entrees) elle ralentie tout et je suis obligé de changer le temps des requetes pour qu'elles passent et ca devient hyper long!

Reply

Marsh Posté le 22-08-2003 à 20:28:59    

vérifie la version de mysql
 
mysql supporte depuis peu les sous-requêtes de ce type.
 
sinon, y'a combien de lignes dans table2 ?

Reply

Marsh Posté le 22-08-2003 à 22:26:07    

si tu as easyphp tu as forcement une version de mysql inferieur a 4.1 et donc tu ne peux faire ca directement.

Reply

Marsh Posté le 23-08-2003 à 02:00:11    

MagicBuzz a écrit :

vérifie la version de mysql
 
mysql supporte depuis peu les sous-requêtes de ce type.
 
sinon, y'a combien de lignes dans table2 ?


euh... oups :D en effet, c'est 4.1 que je voulais dire, pas 1.4 :ange:

Reply

Marsh Posté le 23-08-2003 à 19:52:01    

Bon désolé de mon absence mais comme je vais pas au boulot le we j'ai reinstallé le tt sur ma machine. Avec easyphp 1.6 apparement on a effectivement une version inferieur a 4.1 ca doit etre du style 3.23.49.
Quand j'essaie chez moi ca donne le meme resultat: au moins il y a cohérence qqpart!!!
Sinon ma 2eme table a environ 6000 entrees pourquoi?

Reply

Marsh Posté le 23-08-2003 à 19:52:01   

Reply

Marsh Posté le 23-08-2003 à 19:54:56    

Laors la j ai pas saisi ta question :-)

Reply

Marsh Posté le 23-08-2003 à 19:56:54    

Je me demande simplement l'utilité de connaitre le nombre d'entrées des tables qd le pb se situe apparement au niveau de la requete.

Reply

Marsh Posté le 24-08-2003 à 23:15:03    

Parceque les SGBD ont une limite de nombre d'entrées pour la clause IN. Avec Oracle par exemple, c'est 1000. Je pense qu'avec MySQL, la limitation sera du même ordre de grandeur.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed