Bonjour,
Je voudrais savoir quelle est la meilleure façon de faire pour vérifier par exemple si un contrat de la tableA exitse dans la tableB.
La clé commune aux deux tables (id_contrat).
Merci!
Bonjour,
Je voudrais savoir quelle est la meilleure façon de faire pour vérifier par exemple si un contrat de la tableA exitse dans la tableB.
La clé commune aux deux tables (id_contrat).
Merci!
créer une foreign key si ça présence est obligatoire
Sinon,
Ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT * FROM TableA WHERE id_contrat NOT IN (SELECT id_contrat FROM TableB)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT * FROM TableA A WHERE NOT EXISTS (SELECT 1 FROM TableB B WHERE A.id_contrat=B.id_contrat)
Merci pour la réponse mais est-il possible de mettre en place une jointure classique pour la même requête et si non pourquoi ?
Merci!
Une dernière chose si possible!
Je dois exécuter une requête
qui m'affiche les contrats de la table A (id_contrat)
qui existent dans la table B (id_contrat) et
qui ont un statut (statut <>'d') dans la table C (id_contrat, statut) et
qui ne sont pas dans la table D (id_contrat)
Merci!
J'aimerai pouvoir supprimer le dernier commentaire car c'était juste pour vous préciser mais pas pour le public svp!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT * FROM TableA A INNER JOIN TableB B ON A.id_contrat=B.id_contrat WHERE statut <> 'd' AND NOT EXISTS (SELECT 1 FROM TableC C WHERE A.id_contrat=C.id_contrat)
Désolé la requête ne fonctionne pas mais aussi la table D n'est pas utilisée.
Je ne sais pas si je me suis mal fait comprendre pour la requête. Mais ce que je cherche à faire c'est de pouvoir afficher tous les contrats de la table A qui existent dans la table B et qui ont un statut différent de 'd' et que le statut est défini dans une table C et qui contient aussi l'id du contrat et enfin que les contrats à afficher n'appartiennent pas à la table D.
J'ai vraiment besoin de pouvoir afficher ça et de la meilleure façon surtout pour une meilleure performance de la requête et ça me permettra de mieux comprendre pour la prochaine fois.
Merci d'avance!
Ouais enfin, faudrait pas trop pousser non plus, t'as le droit de chercher à extrapoler avec les exemples que j'ai donné
Bonjour,
J'aimerai savoir si ma requête est correcte par rapport à ce que je cherche à faire
Merci!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT * FROM tableA A INNER JOIN tableB B ON A.id_contrat=B.id_contrat INNER JOIN tableC C ON (A.id_contrat=C.id_contrat AND C.STATUT <> 'd') AND NOT EXISTS (SELECT 1 FROM tableD D WHERE A.id_contrat=D.id_contrat)
Non pas vraiment
Ca dépend des cardinalités de vos associations.
Si pour une ligne de TableA vous avez une ligne dans TableB, une ligne dans TableC où le statut n'est pas à 'd', alors à une erreur de syntaxe près c'est correct (remplacez le dernier AND par un WHERE).
Si vos cardinalités sont (1, n), votre requête renverra des doublons.
Il faudra alors écrire soit :
Soit écrire uniquement avec des EXISTS / NOT EXISTS :
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT DISTINCT A.*
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT * FROM tableA A WHERE EXISTS (SELECT NULL FROM tableB B WHERE A.id_contrat = B.id_contrat) AND EXISTS (SELECT NULL FROM tableC C WHERE A.id_contrat = C.id_contrat AND C.STATUT <> 'd') AND NOT EXISTS (SELECT NULL FROM tableD D WHERE A.id_contrat = D.id_contrat)
c'est quoi la différence entre
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT * FROM tableA A WHERE EXISTS (SELECT NULL FROM tableB B WHERE A.id_contrat = B.id_contrat)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT * FROM tableA A INNER JOIN tableB B ON A.id_contrat = B.id_contrat
Différence en nombre de lignes et de colonnes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 With TableA AS ( select 1 as id_contrat from dual ) , TableB AS ( select 1 as id_contrat from dual union all select 1 from dual ) SELECT * FROM tableA A WHERE EXISTS (SELECT NULL FROM tableB B WHERE A.id_contrat = B.id_contrat); ID_CONTRAT ---------- 1 1 row selected.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 With TableA AS ( select 1 as id_contrat from dual ) , TableB AS ( select 1 as id_contrat from dual union all select 1 from dual ) SELECT * FROM tableA A INNER JOIN tableB B ON A.id_contrat = B.id_contrat; ID_CONTRAT ID_CONTRAT_1 ---------- ------------ 1 1 1 1 2 rows selected.
Merci pour vos réponses mais avec les deux requêtes de orafrance j'ai les même résultats.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager