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!
Version imprimable
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,
OuCode:
1
2 SELECT * FROM TableA WHERE id_contrat NOT IN (SELECT id_contrat FROM TableB)
Code:
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!
C'est pour vos exercices de cours ? ;)
J'aimerai pouvoir supprimer le dernier commentaire car c'était juste pour vous préciser mais pas pour le public svp!
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é :roll:
Bonjour,
J'aimerai savoir si ma requête est correcte par rapport à ce que je cherche à faire
Merci!Code:
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)
Ca parait bon :ccool:
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:SELECT DISTINCT A.*
Code:
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
etCode:
1
2
3
4 SELECT * FROM tableA A WHERE EXISTS (SELECT NULL FROM tableB B WHERE A.id_contrat = B.id_contrat)
Code:
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:
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:
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.