delete from

delete from - SQL/NoSQL - Programmation

Marsh Posté le 10-12-2007 à 13:22:40    

Bonjour  
 
j'ai 2 table sur access: table_1 (300000 enregistrements) et table_2 (3000 enregistrements). La table_2 étant les suppressions à faire dans la table_1.  
-TABLE_1  
NOM1 NOM2 A B C  
-TABLE_2  
NOM1 NOM2  
J'essaye donc de créer une requête sql de suppression des enregistrements de la table 2 vers table 1 (ce qui permet d'identifier de manière unique un enregistrement est Nom1 + Nom2)  
 
J'ai testé avec les 2 requête suivantes le problème est qu'il me supprime tous les enregistrements (donc plus que prévu) où il trouve une correspondance entre:  
TABLE_1.NOM1 ET TABLE_2.NOM1  
OU  
TABLE_1.NOM2 ET TABLE_2.NOM2  
 
 
DELETE *  
FROM TABLE_1  
WHERE NOM1 IN (SELECT NOM1 FROM TABLE_2) AND NOM2 IN (SELECT NOM2 FROM TABLE_2);  
 
DELETE *  
FROM TABLE_1  
WHERE TABLE_1.NOM1 IN (SELECT TABLE_1.NOM1 FROM TABLE_1 INNER JOIN TABLE_2 ON (TABLE_2.NOM1 = TABLE_1.NOM1))  
AND TABLE_1.NOM2 IN (SELECT TABLE_1.NOM2 FROM TABLE_1 INNER JOIN TABLE_2 ON (TABLE_2.NOM2 = TABLE_1.NOM2));  
 
Merci pour votre aide

Reply

Marsh Posté le 10-12-2007 à 13:22:40   

Reply

Marsh Posté le 10-12-2007 à 13:40:19    

(nom1, nom2) c'est une clef ?

Reply

Marsh Posté le 10-12-2007 à 13:41:16    

Essayer

DELETE *  
FROM TABLE_1  
WHERE TABLE_1.NOM1 & "|" & TABLE_1.NOM2
 IN (SELECT TABLE_2.NOM1 & "|" & TABLE_2.NOM2 FROM TABLE_2);  


Message édité par olivthill le 10-12-2007 à 13:41:33
Reply

Marsh Posté le 10-12-2007 à 14:09:22    

c'est bien sauf que c'est pas du SQL.

Reply

Marsh Posté le 10-12-2007 à 15:02:45    

le truc de olivthill devrait marcher si le & est une concatenation en access et que les quotes sont les bonnes.
 
sinon ceci devrait passer en oracle, ptetre que en access aussi même si j'ai un doute
 

Code :
  1. where (a.nom1,a.nom2) in (select b.nom1,b.nom2 from table2 b)

Reply

Marsh Posté le 10-12-2007 à 15:38:18    

(Pas essayer celle olivthill vu que pas sql) mais la requête de Casimimir ne fonctionne pas et access me renvoi le message suivant:
 
Vous avez écrit une sous-requête pouvant renvoyer plus d’un champ sans utiliser le mot réservé EXISTS dans la clause FROM de la requête principale. Révisez l'instruction SELECT de la sous-requête pour obtenir un seul champ.

Reply

Marsh Posté le 10-12-2007 à 16:06:46    

Regarde du côté de
 
DELETE *
FROM X
USING Y


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 10-12-2007 à 16:19:02    

Autant pour moi : pas de USING sous Access.
 
Par contre, ça, ça doit fonctionner (même principe que le USING en fait) :
DELETE Table1.*
FROM Table1 t1, Table2 t2
WHERE t1.foo = t2.bar


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 10-12-2007 à 16:54:45    

je vois pas trop en quoi la requete de olivthill n'est pas du sql mais bon...

Reply

Marsh Posté le 11-12-2007 à 08:44:00    

casimimir a écrit :

je vois pas trop en quoi la requete de olivthill n'est pas du sql mais bon...


laisse tomber

Reply

Marsh Posté le 11-12-2007 à 08:44:00   

Reply

Marsh Posté le 11-12-2007 à 09:59:49    

ou bien tu parlais des premieres requetes de gerald25? car il n'a pas essayé celle d'olivthill a cause de ce commentaire.

Reply

Marsh Posté le 11-12-2007 à 11:40:56    

J'ai essayer quand même celle d'olivthill (au cas ou) mais access ne comprend pas la requete et me renvoie un message d'erreur de syntaxe sql

Reply

Marsh Posté le 11-12-2007 à 12:01:19    

c'est ce que j'avais mentionné, c'est la ou il faudrait que qqu'un utilisant access puisse aider, dans sa requete il a utilié & pour concaténer les chaines de caractères, est ce que & sert a cela sous access, et est ce que les doubles quotes " servent bien a quoter une chaine litérale en access, par exemple en oracle ce sont les simples.
 
son delete est incorrect mais bon l'idée était la
 
sous oracle j'aurai écris:
 

Code :
  1. DELETE TABLE_1 
  2. WHERE (TABLE_1.NOM1 || '|' || TABLE_1.NOM2)
  3. IN (SELECT TABLE_2.NOM1 || '|' || TABLE_2.NOM2 FROM TABLE_2);


Message édité par casimimir le 11-12-2007 à 12:07:07
Reply

Marsh Posté le 11-12-2007 à 13:39:44    

En access, si mes souvenirs sont bon, pour concaténer les chaines, c'est '+'.
Ceci dit, ma solutin fonctionne et est quand même plus "propre" !


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 11-12-2007 à 17:52:09    

Code :
  1. DELETE table1
  2. WHERE EXISTS (SELECT NULL FROM table2 WHERE table2.nom1 = table1.nom1 AND table2.nom2 = table1.nom2)


 
Ca devrait marcher.

Reply

Marsh Posté le 12-12-2007 à 09:50:04    

Un grand merci à tous  
 
La requete de magic buzz marche (juste rajouter le from après delete)
 
Tu ma enlevé une sacré épine du pied

Reply

Sujets relatifs:

Leave a Replay

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