Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/08/2011, 15h18   #1
Membre habitué
 
Avatar de jlm22
 
Homme Jean-Louis
Etudiant
Inscription : décembre 2010
Messages : 199
Détails du profil
Informations personnelles :
Nom : Homme Jean-Louis
Âge : 20
Localisation : France

Informations professionnelles :
Activité : Etudiant

Informations forums :
Inscription : décembre 2010
Messages : 199
Points : 114
Points : 114
Par défaut Problème Exists in

Bonjour à tous,

J'ai un problème de requête à cause d'un not exists, et j'avoue ne pas comprendre le résultat de ma requête.

Situation :
je simplifie un maximum le problème
2 table : table 1 sur base 1 et table 2 sur base 2

table 1 est une copie de table 2 au niveau structure

table 1(cgest,blabla)
1|bla
1|blu
1|blo
1|bli
0|bly
0|bls

table 2 (cgest,blabla)
1|bla
1|blu
1|blo


Requête :
En fait je souhaite récupérer les éléments dont le cgest est à 1 et qui ne sont pas déjà dans la table 2 et les insérer dans table 2.

Voilà ma requête :

Code :
1
2
3
4
5
 
INSERT INTO table2
SELECT * FROM table1@base1
WHERE cgest = '1'
AND NOT EXISTS (SELECT * FROM table2);
mais elle ne marche pas.

Code :
1
2
3
4
 
SELECT count(*) FROM table1@base1
WHERE NOT EXISTS (SELECT * FROM table2)
AND cgest = '1';
j'ai donc fait cette requête qui est sensée me retourner 1 mais que nenni elle me retourne 0 , Pourriez vous m'éclaircir ? j'ai du rater un truc monstrueux mais là je vois pas du tout

Merci
__________________
Pourquoi faire simple quand on peut faire .......... compliqué
jlm22 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 15h30   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Si table2 n'est pas vide alors il existe forcément une ligne

Voila qui devrait aller mieux :
Code :
1
2
3
4
INSERT INTO table2 t2
SELECT * FROM table1@base1
WHERE cgest = '1'
AND NOT EXISTS (SELECT * FROM table2 WHERE ID = t2.ID);
ID étant l'identifiant unique dans table2 pour s'assurer que la ligne n'est pas déjà présente.
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 15h37   #3
Membre habitué
 
Avatar de jlm22
 
Homme Jean-Louis
Etudiant
Inscription : décembre 2010
Messages : 199
Détails du profil
Informations personnelles :
Nom : Homme Jean-Louis
Âge : 20
Localisation : France

Informations professionnelles :
Activité : Etudiant

Informations forums :
Inscription : décembre 2010
Messages : 199
Points : 114
Points : 114
Je ne comprend pas trop "ID" c'est quoi un champ de ma table ou quelque chose de générique, j'ai copier texto et donc "identificateur non valide".

En mode boulet désolé
__________________
Pourquoi faire simple quand on peut faire .......... compliqué
jlm22 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 15h49   #4
Membre chevronné
 
Homme O. Joly
Support
Inscription : décembre 2010
Messages : 287
Détails du profil
Informations personnelles :
Nom : Homme O. Joly
Âge : 38
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Support
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2010
Messages : 287
Points : 617
Points : 617
visiblement chez vous ID est en fait la colonne cgest

Code :
1
2
3
4
INSERT INTO table2 t2
SELECT * FROM table1@base1 t1
WHERE cgest = '1'
AND NOT EXISTS (SELECT * FROM table2 WHERE cgest = t1.cgest  AND blabla = t1.blabla);
ojo77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 15h55   #5
Membre habitué
 
Avatar de jlm22
 
Homme Jean-Louis
Etudiant
Inscription : décembre 2010
Messages : 199
Détails du profil
Informations personnelles :
Nom : Homme Jean-Louis
Âge : 20
Localisation : France

Informations professionnelles :
Activité : Etudiant

Informations forums :
Inscription : décembre 2010
Messages : 199
Points : 114
Points : 114
Impeccable Ojo77 et Orafrance merci à vous 2. J'ai modifié à ma sauce pour que ça fonctionne.
Bref nickel
__________________
Pourquoi faire simple quand on peut faire .......... compliqué
jlm22 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 16h13   #6
Membre expérimenté
 
Homme Mohamed Houri
Inscription : mars 2010
Messages : 286
Détails du profil
Informations personnelles :
Nom : Homme Mohamed Houri
Localisation : France

Informations forums :
Inscription : mars 2010
Messages : 286
Points : 563
Points : 563
Bonjour,

Comme cgest semble ne pas être un id unique et comme il semble aussi que vous n'avez aucune clé d'unicité vous ne pouvez alors faire que comme cela a déjà été proposé (c'est à dire avec cgest et les autres champs aussi)

Voici ci-dessous un exemple très simple.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
 
mhouri.world > CREATE TABLE table1(cgest number, c varchar2(10));
 
TABLE created.
 
mhouri.world > CREATE TABLE table2(cgest number, c varchar2(10));
 
TABLE created.
 
mhouri.world > INSERT INTO table1 VALUES (1, 'bla');
 
1 row created.
 
mhouri.world > INSERT INTO table1 VALUES (1, 'blu');
 
1 row created.
 
mhouri.world > INSERT INTO table1 VALUES (1, 'blo');
 
1 row created.
 
mhouri.world > INSERT INTO table1 VALUES (1, 'bli');
 
1 row created.
 
mhouri.world > INSERT INTO table2 VALUES (1, 'bla');
 
1 row created.
 
mhouri.world > INSERT INTO table2 VALUES (1, 'blu');
 
1 row created.
 
mhouri.world > INSERT INTO table2 VALUES (1, 'blo');
 
1 row created.
 
mhouri.world > commit;
 
Commit complete.
 
 
mhouri.world >ed
Wrote file afiedt.buf
 
  1  INSERT INTO table2 
  2  SELECT * FROM table1 t1
  3  WHERE t1.cgest = 1
  4  AND NOT EXISTS (SELECT NULL
  5                   FROM table2 t2
  6                   WHERE t2.cgest = t1.cgest
  7                   AND   t2.c     = t1.c
  8*                )
mhouri.world >/
 
1 row created.
 
mhouri.world > commit;
 
Commit complete.
 
mhouri.world > SELECT * FROM table1;
 
     CGEST C                                                                                                       
---------- ----------                                                                                                
         1 bla                                                                                                          
         1 blu                                                                                                          
         1 blo                                                                                                          
         1 bli                                                                                                          
 
mhouri.world > SELECT * FROM table2;
 
     CGEST C                                                                                                            
---------- ----------                                                                                                   
         1 bla                                                                                                          
         1 blu                                                                                                          
         1 blo                                                                                                          
         1 bli
Préferez également plutôt ceci
Code :
1
2
3
4
5
 AND NOT EXISTS (SELECT NULL
                                  FROM table2 t2
                                  WHERE t2.cgest = t1.cgest
                                   AND   t2.c     = t1.c
                                  )
à ceci

Code :
1
2
3
4
5
 AND NOT EXISTS (SELECT *
                                  FROM table2 t2
                                  WHERE t2.cgest = t1.cgest
                                   AND   t2.c     = t1.c
                                  )
car en effet cela ne sert à rien de sélectionner tous les champs pour valider l'existence de l'enregistrement

Bien à vous

Mohamed Houri
Mohamed.Houri est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h38.


 
 
 
 
Partenaires

Hébergement Web