Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/12/2010, 10h58   #1
Invité de passage
 
Inscription : août 2005
Messages : 4
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 4
Points : 1
Points : 1
Par défaut incohérence jointure externe help

Bonjour et merci de me lire. Je suis inexpérimenté et ai besoin d'aide.

J'ai 4 tables, L T P et D. Je désire faire une jointure interne sur les 3 premières, et réaliser une jointure externe sur la dernière ( D ). En effet, les champs issus de D sont facultatifs. Or le nombre de lignes retourné est de 30097 à la fin, alors que la table de départ ( issu de la jointure interne ) est de 26369 . J'ai essayé qu'avec les jointures, puis ai essayé avec une sous requête, mais sans succès : je me retrouve toujours avec un nombre de ligne de 30097. Je ne comprends pas.

ma requete juste en jointures:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
						L.Datum, L.Behandler, L.FK_BehandlerHO, L.Behandlung_Kv, L.PositionNr, L.Punkte, L.Total_Fr,
						T.Zahler, T.Patient, T.STATUS, T.Total_Leistungen,T.VorauszahlungsBetrag,
						P.Nummer, P.Name, P.Vorname,
						D.FK_Patient, D.FK_Behandlung, D.RechNr, D.Betrag, D.Datum
 
						FROM movedb.Leistung L
 
						JOIN movedb.Behandlung_KV T
						ON T.Zahler = L.Behandlung_Kv
 
						JOIN movedb.Patient P
						ON P.Nummer = T.Patient
 
						LEFT JOIN  movedb.Debi D
						ON D.FK_Behandlung = T.Zahler
requete avec sous requete :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT     R.Datum, R.Behandler, R.FK_BehandlerHO, R.Behandlung_Kv, R.PositionNr, R.Punkte, R.Total_Fr,
                        R.Zahler, R.Patient, R.STATUS, R.Total_Leistungen,R.VorauszahlungsBetrag,
                        R.Nummer, R.Name, R.Vorname,
                        D.FK_Patient, D.FK_Behandlung, D.RechNr, D.Betrag, D.Datum
 
 
                        FROM            (SELECT
                        L.Datum, L.Behandler, L.FK_BehandlerHO, L.Behandlung_Kv, L.PositionNr, L.Punkte, L.Total_Fr,
                        T.Zahler, T.Patient, T.STATUS, T.Total_Leistungen,T.VorauszahlungsBetrag,
                        P.Nummer, P.Name, P.Vorname
 
                        FROM movedb.Leistung L
 
                        JOIN movedb.Behandlung_KV T
                        ON T.Zahler = L.Behandlung_Kv
 
                        JOIN movedb.Patient P
                        ON P.Nummer = T.Patient) R
 
                        LEFT OUTER JOIN  movedb.Debi D
                        ON D.FK_Behandlung = R.Zahler
Quelqu'un aurait il une explication, pour m'aider à solutionner mon problème ? merci beaucoup.
raphlac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 11h14   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 529
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 529
Points : 3 521
Points : 3 521
Saluton,
Ton raisonnement n'est recevable que si tu as des liaisons 1-1 entre les tables, dès qu'il y a possibilité d'une liaison 1-n ....
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 11h15   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 977
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 977
Points : 18 221
Points : 18 221
Envoyer un message via MSN à CinePhil
Tu peux faire un EXPLAIN de ta requête ?

Citation:
alors que la table de départ ( issu de la jointure interne ) est de 26369
Tu veux dire que le résultat des deux premières jointures donne 26369 lignes ou que la table movedb.Patient P contient 26369 lignes ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 11h22   #4
Invité de passage
 
Inscription : août 2005
Messages : 4
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 4
Points : 1
Points : 1
Merci de cet avis. Ma table D a cependant bien uniquement une seule possibilité de jointure selon le ON.

Je sèche vraiment sur ce coup là...
pour plus de précision :
26369 issus des deux premières jointures.

la première table L a 26 404 enregistrements,
le table P en a 1261 et la table T en a 3223.

Les 26369 sont justes, c'est vérifié.
raphlac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 11h34   #5
Invité de passage
 
Inscription : août 2005
Messages : 4
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 4
Points : 1
Points : 1
Voici le retour de EXPLAIN : je suis trop débutant pour comprendre cela.

0 : id : 1
0 : select_type : SIMPLE
0 : table : D
0 : type : ALL
0 : possible_keys :
0 : key :
0 : key_len :
0 : ref :
0 : rows : 3513
0 : Extra :
1 : id : 1
1 : select_type : SIMPLE
1 : table : L
1 : type : ref
1 : possible_keys : Behandlung_Kv
1 : key : Behandlung_Kv
1 : key_len : 5
1 : ref : movedb.T.Zahler
1 : rows : 6
1 : Extra : Using where
2 : id : 1
2 : select_type : SIMPLE
2 : table : P
2 : type : ALL
2 : possible_keys : Nummer
2 : key :
2 : key_len :
2 : ref :
2 : rows : 1261
2 : Extra :
3 : id : 1
3 : select_type : SIMPLE
3 : table : T
3 : type : ref
3 : possible_keys : PRIMARY,Patient
3 : key : Patient
3 : key_len : 5
3 : ref : movedb.P.Nummer
3 : rows : 1
3 : Extra : Using where
raphlac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 13h43   #6
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 529
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 529
Points : 3 521
Points : 3 521
Citation:
Envoyé par raphlac Voir le message
Je sèche vraiment sur ce coup là...
pour plus de précision :
26369 issus des deux premières jointures.

la première table L a 26 404 enregistrements,
le table P en a 1261 et la table T en a 3223.

Les 26369 sont justes, c'est vérifié.
Donc déjà certaines liaisons L->T ou T->P ne sont pas en 1-1 mais en 1-n
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 14h07   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 977
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 977
Points : 18 221
Points : 18 221
Envoyer un message via MSN à CinePhil
Quel est le résultat de cette requête ?
Code :
1
2
3
SELECT COUNT(*)
FROM movedb.Leistung L
JOIN movedb.Behandlung_KV T ON T.Zahler = L.Behandlung_Kv
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 14h11   #8
Invité de passage
 
Inscription : août 2005
Messages : 4
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 4
Points : 1
Points : 1
Oui, je commence a comprendre. En vérité, il faut D.FK_Behandlung soit unique pour que cela fontionne comme cela. Je viens de regarder, ce n'est pas le cas.
Merci, a moi de trouver une solution. Problème résolu ( ou plutôt compris ).
Merci a tous de votre contribution.
raphlac est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h12.


 
 
 
 
Partenaires

Hébergement Web