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
Nom : Sans titre.jpg
Affichages : 286
Taille : 22,5 Ko

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...
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;
...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.

Ai-je loupé un truc sur les jointures ?

Merci à tous de votre attention.