Pb Jointure - produit cartesien

Fermé
Pierre81 - 24 avril 2008 à 19:14
R4f Messages postés 441 Date d'inscription dimanche 13 janvier 2008 Statut Membre Dernière intervention 5 mai 2008 - 25 avril 2008 à 15:59
Bonjour,

J'ai deux tables (assez grosses).
Dans la première, j'ai deux lignes avec une même valeur d'un champ (champ NB)
dans la deuxième, j'ai 12 lignes avec cette même valeur dans le même nom de champ.

Le script que j'étudie fait simplement une jointure Table1.NB = Table2.NB
je m'attend donc à trouver 24 lignes, cad le produit cartesien des deux.

Or seules 12 lignes sortent !

J'aimerai comprendre pourquoi le produit cartesien ne s'applique pas ?
On m'a dit que peut-être la requête s'arreterait dès qu'il trouve un NB sur la table 1 ??? mais ça m'étonne.
On m'a dit aussi que peut-être, comme d'autres champs sont communs entre les deux tables, il ferait une jointure "cachée" pour optimiser la requête ????


Bref, un expert saurait-il me répondre ?

Merci beaucoup !!!
A voir également:

1 réponse

R4f Messages postés 441 Date d'inscription dimanche 13 janvier 2008 Statut Membre Dernière intervention 5 mai 2008 62
24 avril 2008 à 20:49
Salut Pierre81,

Ton cas est assez mal expliqué, donc je vais peut-être répondre à côté de la plaque...

Le produit cartésien est une notion ensembliste. Cf. : https://fr.wikipedia.org/wiki/Produit_cart%C3%A9sien#D.C3.A9finition

Si tu as 5 éléments dans un ensemble A et 6 dans un ensemble B, leur produit cartésien comprend 5 x 6 élements, soit 30.

Lorsqu'on fait une jointure, on parle symboliquement de partir de ce produit cartésien et de réduire les appariements (les couples d'éléments de A et de B) selon une contrainte d'égalité entre 2 champs.

L'exemple bateau est celui des employés et des services dans lesquels ils travaillent :

Employés (nom_employé, id_service)
Jojo | 1
Lulu | 1
Gégé | 2
Toto | 3
Rara | 4
Coco | 4

Services (id, nom_service)
1 | Comptabilité
2 | Direction générale
3 | Achats
4 | Informatique

Si on veut faire la jointure des 2 tables, il sera assez naturel de faire correspondre le champ id_service de la table Employés avec le champ id de la table Services

En SQL relativement standard, cela donne
SELECT nom_employé, nom_service FROM Employés, Services WHERE id_service = id
ou plus proprement (avec jointure explicite)
SELECT nom_employé, nom_service FROM Employés INNER JOIN Services ON id_service = id

On appelle cela une jointure interne.
Le résultat est
Jojo | Comptabilité
Lulu | Comptabilité
Gégé | Direction générale
Toto | Achats
Rara | Informatique
Coco | Informatique


Il y a donc 6 résultats.
Par contre le produit cartésien Employés x Services comporte 24 résultats (6 x 4).

Raph
0
Merci beaucoup pour cette explication, qui m'éclaire un peu sur le sujet, mais ce n'est pas exactement mon problème :)

Je vais essayer de mieux expliquer :
Dans une table T1, j'ai deux lignes avec le mm NB
dans la table T2, j'ai 12 lignes avec le mm NB
en faisant une requête avec la jointure T1.NB = T2.NB, combien de lignes dois-je obtenir ?

Je pensais devoir en obtenir 24, mais j'en obtiens 12. C'est là mon souci, sur le nombre de lignes rendues.

Merci d'avance.
0
R4f Messages postés 441 Date d'inscription dimanche 13 janvier 2008 Statut Membre Dernière intervention 5 mai 2008 62 > Pierre81
25 avril 2008 à 10:20
Bon, tu sais, si tu expliques toujours le problème de la même manière, tu vas toujours avoir la même réponse, donc change de disque STP.

Donne des exemples !

0
Pierre81 > R4f Messages postés 441 Date d'inscription dimanche 13 janvier 2008 Statut Membre Dernière intervention 5 mai 2008
25 avril 2008 à 15:15
Bah je ne sais pas comment l'expliquer autrement ! :)

Je n'ai pas d'exemple précis à donner. les tables sont monstrueuses.

Mais tant pis. Merci beaucoup quand même.
0
R4f Messages postés 441 Date d'inscription dimanche 13 janvier 2008 Statut Membre Dernière intervention 5 mai 2008 62 > Pierre81
25 avril 2008 à 15:59
Tu ne peux pas prendre des exemples ?

De toute façon, c'est normal d'en obtenir que 12 et non pas 24. Car tu fis une jointure sur l'égalité de 2 champs (l'un dans une table, l'autre dans l'autre table) donc c'est normal d'avoir autant de résultats que la table 'maitresse' (dans mon exemple, c'est Employés) puisque à chaque employé ne correspond qu'un et un seul enregistrement de la table Services.


Dans mon exemple, si j'avais le double de résultats, cela voudrait dire que les employés sont dans 2 services, ce qui n'est pas le cas...

Raph
0