Bonjour à tous
Donc oui, j'ai un souci de jointure car en essayant d'écrire un truc de test je suis arrivé à une jointure qui fonctionne alors qu'elle ne le devrait pas.
Prenons 2 tables: produit et fournisseur. Vu qu'un produit peut être fourni par plusieurs fournisseurs, et qu'un fournisseur peut fournir plusieurs produits, on va rajouter une relation 'approvisionner" pour faire le lien.
Ce qui donne le modèle suivant
Voici les tables (bdd PostgreSQL)
Code sql : 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
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 -- Table "produit" drop table if exists "produit" cascade; create table "produit" ( "id_produit" smallint, "nom" character varying(20), "qte" smallint, "tva" decimal(4, 2), primary key ("id_produit") ); -- Remplissage insert into "produit" values (1, 'dentifrice', 40, '20.0'); -- Table "fournisseur" drop table if exists "fournisseur" cascade; create table "fournisseur" ( "id_fournisseur" smallint, "nom" character varying(20), "telephone" character(10), primary key ("id_fournisseur") ); -- Remplissage insert into "fournisseur" values (10, 'fournisseurA', '123456'); insert into "fournisseur" values (20, 'fournisseurB', '654321'); insert into "fournisseur" values (30, 'Autre', '999999'); -- Table "approvisionner" drop table if exists "approvisionner" cascade; create table "approvisionner" ( "id_produit" smallint, constraint "fk_produit" foreign key ("id_produit") references "produit" ("id_produit") match full on update cascade on delete cascade, "id_fournisseur" smallint, constraint "fk_fournisseur" foreign key ("id_fournisseur") references "fournisseur" ("id_fournisseur") match full on update cascade on delete restrict, "prix_achat" decimal(7, 2) not null check ("prix_achat" > 0), primary key ("id_produit", "id_fournisseur") ); -- Remplissage insert into "approvisionner" values (1, 10, '2.20'); insert into "approvisionner" values (1, 20, '2.17');
De là, si on veut les fournisseurs de notre dentifrice, il faut faire deux jointures imbriquées. Pour l'instant pas de problème...
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 -- test jointure n° 1 select produit.*, fournisseur.* from produit inner join approvisionner inner join fournisseur on fournisseur.id_fournisseur = approvisionner.id_fournisseur on approvisionner.id_produit = produit.id_produit;
Toutefois j'ai tenté la jointure suivante...
...qui, surprise, m'a donné le même résultat. Pourtant, telle qu'elle est écrite, cette seconde jointure n'est pas imbriquée dans la première. Dans mon esprit elle n'aurait pas dû fonctionner. Ecrire ...from produit inner join fournisseur indique que produit est directement lié à fournisseur alors que ce n'est pas le cas.
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 -- test jointure n° 2 select produit.*, fournisseur.* from produit inner join approvisionner on approvisionner.id_produit = produit.id_produit inner join fournisseur on fournisseur.id_fournisseur = approvisionner.id_fournisseur;
Ai-je loupé un truc sur les jointures ?
Merci à tous de votre attention.
Partager