Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Requête avec EXISTS

2 réponses
Avatar
Isa
Bonjour,

J'ai une table personne et une table contact.
Je souhaite ponctuellement créer pour toutes les personnes qui n'en ont pas,
un contact.
Je voulais me servir de la commande SQL EXISTS.
Ma requête aurait été un truc de ce genre :
"INSERT INTO contact (code_personne, num_type_contact, num_objet_contact,
num_origine_contact, num_type_acteur, date_contact, cmt )
SELECT personne.code_personne, 2 AS Expr1, 10 AS Expr2, 7 AS Expr3, 1 AS
Expr4, personne.date_contact_selection, personne.cmt
FROM personne WHERE NOT EXISTS (SELECT * FROM contact WHERE
contact.num_objet_contact=10);"

J'ai l'impression que le NOT EXISTS ne fonctionne pas.
Auriez-vous une solution à mon pb ?
D'avance merci.

Isa.

2 réponses

Avatar
Richard_35
Bonjour Isa,

Il me semble que tu fais une petite confusion :
"WHERE NOT EXISTS (SELECT * FROM contact WHERE
contact.num_objet_contact)"
veut dire :
"si il n'existe aucun enregistrement dans contact dont
contact.num_objet_contact (tout personne.code_personne confondu)."
D'ailleurs, à aucun moment, tu ne fais la liaison entre
personne.code_personne et contact.code_personne, donc Access ne peut pas le
savoir.

Si tu veux créer dans CONTACT les enregistrements de PERSONNE qui n'existent
pas dans CONTACT, je te propose de créer, par l'assistant, une requête ajout
de non-correspondance entre PERSONNE et CONTACT, ce qui donnera, en gros :
INSERT INTO contact (code_personne, num_type_contact, num_objet_contact,
num_origine_contact, num_type_acteur, date_contact, cmt )


SELECT personne.code_personne, 2 AS Expr1, 10 AS Expr2, 7 AS Expr3, 1 AS
Expr4, personne.date_contact_selection, personne.cmt


FROM personne LEFT JOIN contact ON personne.code_personne =
contact.code_personne
WHERE (contact.code_personne Is Null);

Dis-nous et bon courage,
Richard.

"Isa" a écrit :

Bonjour,

J'ai une table personne et une table contact.
Je souhaite ponctuellement créer pour toutes les personnes qui n'en ont pas,
un contact.
Je voulais me servir de la commande SQL EXISTS.
Ma requête aurait été un truc de ce genre :
"INSERT INTO contact (code_personne, num_type_contact, num_objet_contact,
num_origine_contact, num_type_acteur, date_contact, cmt )
SELECT personne.code_personne, 2 AS Expr1, 10 AS Expr2, 7 AS Expr3, 1 AS
Expr4, personne.date_contact_selection, personne.cmt
FROM personne WHERE NOT EXISTS (SELECT * FROM contact WHERE
contact.num_objet_contact);"

J'ai l'impression que le NOT EXISTS ne fonctionne pas.
Auriez-vous une solution à mon pb ?
D'avance merci.

Isa.


Avatar
Sylvain Lafontaine
Vous devez établir la relation entre chaque ligne de Personne et la
sous-requête présente dans l'appel to Not Exists():

INSERT INTO contact (code_personne, num_type_contact, num_objet_contact,
num_origine_contact, num_type_acteur, date_contact, cmt )
SELECT personne.code_personne, 2 AS Expr1, 10 AS Expr2, 7 AS Expr3, 1 AS
Expr4, personne.date_contact_selection, personne.cmt
FROM personne WHERE NOT EXISTS (SELECT * FROM contact WHERE
contact.num_objet_contact

AND contact.code_personne = personne.code_personne
);

Votre requête sera également plus lisible si vous utilisez les alias pour
les noms des tables:


INSERT INTO contact (code_personne, num_type_contact, num_objet_contact,
num_origine_contact, num_type_acteur, date_contact, cmt )
SELECT P.code_personne, 2 AS Expr1, 10 AS Expr2, 7 AS Expr3, 1 AS
Expr4, P.date_contact_selection, P.cmt
FROM personne as P WHERE NOT EXISTS (SELECT * FROM contact as C1 WHERE
C1.num_objet_contact And C1.code_personne = P.code_personne
);

Pour ce cas simple, vous pouvez également remplacer le NOT Exists par un
Left Join et un test sur les valeurs identités nulles tel que démontré dans
le message de Richard. Finalement, par expérience personnelle, je peux vous
dire que la notation Camel est plus facile à lire que l'utilisation du
symbol de soulignement: NumTypeContact est mieux que num_type_contact parce
que la lecture de tous ces "_" finissent par vous faire tourner la tête:

INSERT INTO Contact (CodePersonne, NumTypeContact, NumObjetContact,
NumOrigineContact, NumTypeActeur, DateContact, Cmt )
SELECT P.CodePersonne, 2 AS Expr1, 10 AS Expr2, 7 AS Expr3, 1 AS
Expr4, P.DateContactSelection, P.cmt
FROM Personne as P WHERE NOT EXISTS (SELECT * FROM Contact as C1 WHERE
C1.NumObjetContact And C1.CodePersonne = P.CodePersonne);

--
Sylvain Lafontaine, ing.
MVP pour « Windows Live Platform »
Courriel: sylvain2009 sylvainlafontaine com (remplissez les blancs, svp.)
Consultant indépendant et programmation à distance pour Access et
SQL-Server.


"Isa" wrote in message
news:
Bonjour,

J'ai une table personne et une table contact.
Je souhaite ponctuellement créer pour toutes les personnes qui n'en ont
pas,
un contact.
Je voulais me servir de la commande SQL EXISTS.
Ma requête aurait été un truc de ce genre :
"INSERT INTO contact (code_personne, num_type_contact, num_objet_contact,
num_origine_contact, num_type_acteur, date_contact, cmt )
SELECT personne.code_personne, 2 AS Expr1, 10 AS Expr2, 7 AS Expr3, 1 AS
Expr4, personne.date_contact_selection, personne.cmt
FROM personne WHERE NOT EXISTS (SELECT * FROM contact WHERE
contact.num_objet_contact);"

J'ai l'impression que le NOT EXISTS ne fonctionne pas.
Auriez-vous une solution à mon pb ?
D'avance merci.

Isa.