Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
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 02/03/2011, 18h59   #1
Invité de passage
 
Inscription : février 2009
Messages : 7
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 7
Points : 1
Points : 1
Par défaut SQL - Jointures - Nombre de résultats différents

Bonjour à tous,

Je bosse sur une requête avec deux jointures et je m'étonne de ne pas récupérer le même nombre de résultats entre les deux requêtes pour les mêmes paramètres.
Exple: Je n'utilise qu'une seule des deux jointures.

Je ne sais pas si je suis très clair, je poste donc les deux requêtes:

La requête avec les deux jointures:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT count(*) FROM OFFRES_DOLBDP o 
JOIN OFFR_UNITE_HABILIT_MER ouhm ON o.off_cle = ouhm.off_cle   
JOIN R_EQUIPE_PRO rep ON o.ALE_CLE = rep.ALE_CLE
WHERE 
 
(1 = '1' OR ouhm.unit_cle= '') AND
 (1 = '1' OR o.ALE_CLE = '')
AND (1 = '0' OR rep.EQU_PRO_CLE = 3) 
AND (1 = '1' OR ID_E_RCE = 1111111111) 
AND (1 = '1' OR o.OFF_NIV_SER = '') 
AND (1 = '1' OR o.OFF_COD_ORI = '') 
AND (1 = '1' OR o.OFF_ETAT_SAGE = '');
Je compte 291061 Offres.

La requête avec l'une des deux seulement:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT count(*) FROM OFFRES_DOLBDP o 
--join OFFR_UNITE_HABILIT_MER ouhm on o.off_cle = ouhm.off_cle    
JOIN R_EQUIPE_PRO rep ON o.ALE_CLE = rep.ALE_CLE
WHERE 
 
--(1 = '1' OR ouhm.unit_cle= '') and
 (1 = '1' OR o.ALE_CLE = '')
AND (1 = '0' OR rep.EQU_PRO_CLE = 3) 
AND (1 = '1' OR ID_E_RCE = 1111111111) 
AND (1 = '1' OR o.OFF_NIV_SER = '') 
AND (1 = '1' OR o.OFF_COD_ORI = '') 
AND (1 = '1' OR o.OFF_ETAT_SAGE = '');
Je ne compte que 59553 Offres

Si quelqu'un pouvait éclairer ma lanterne, ça m'arrangerait sérieusement...

Merci d'avance!
walthwith est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 19h13   #2
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 520
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 520
Points : 3 967
Points : 3 967
Où est le problème ?
Ta première requête est plus restrictive (une jointure et une condition de plus) que la deuxième, donc logiquement, il y a moins de résultat sur la première que sur la deuxième.

C'est quoi ces conditons :
(1 = '1' OR o.ALE_CLE = '') <=> toujours vrai
(1 = '0' OR rep.EQU_PRO_CLE = 3) <=> rep.EQU_PRO_CLE = 3

Pourquoi faire du transtypage 1 = '1' ??
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 20h20   #3
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
Citation:
Envoyé par 7gyY9w1ZY6ySRgPeaefZ Voir le message
Ta première requête est plus restrictive (une jointure et une condition de plus) que la deuxième, donc logiquement, il y a moins de résultat sur la première que sur la deuxième.
Euh.. non ce n'est pas vrai..
Exemple et
Code :
SELECT 1 FROM DUAL d, ALL_TABLES t WHERE t.owner ='SYSTEM'
. J'ai rajouté une jointure et une condition, et j'ai plus de lignes.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 21h05   #4
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 520
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 520
Points : 3 967
Points : 3 967
Citation:
Envoyé par McM Voir le message
Euh.. non ce n'est pas vrai..
Exemple et
Code :
SELECT 1 FROM DUAL d, ALL_TABLES t WHERE t.owner ='SYSTEM'
. J'ai rajouté une jointure et une condition, et j'ai plus de lignes.
Ok, dans l'absolu, c'est une grosse bêtise d'affirmer ça, je le conçois.
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/03/2011, 01h21   #5
Invité de passage
 
Inscription : février 2009
Messages : 7
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 7
Points : 1
Points : 1
Je viens de voir une erreur au sein de mon post précédent. Les nombres d'éléments comptés au sein des requêtes sont en réalité inversés:
1ère requête: 53k offres
2ème requête: 291k offres

Ce que tu dis donc, 7gyY9w1ZY6ySRgPeaefZ, se vérifie au moins dans mon cas


Citation:
C'est quoi ces conditons :
(1 = '1' OR o.ALE_CLE = '') <=> toujours vrai
(1 = '0' OR rep.EQU_PRO_CLE = 3) <=> rep.EQU_PRO_CLE = 3

Pourquoi faire du transtypage 1 = '1' ??
Je me sers de ces conditions afin de construire une requête dynamique.

En effet, la requête est plus restrictive mais si 1 = '1', l'argument n'est pas pris en compte.

Je pensais qu'au final dans la première requête, jointure ou pas jointure, vu que je ne me sers pas de cette partie:
(1 = '1' OR ouhm.unit_cle= '')
pour argument ouhm.unit_cle étant null, je compterai un nombre d'éléments identique à celui trouvé avec la requête dans laquelle il n'est pas présent.

Que les deux requêtes comptent donc 291061 offres.
walthwith est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 10h23   #6
Invité de passage
 
Inscription : février 2009
Messages : 7
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 7
Points : 1
Points : 1
Bonjour à tous!

Des LEFT JOIN suffisaient, au final...

Merci de vos réponses!

Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT count(*) FROM OFFRES_DOLBDP o 
LEFT JOIN OFFR_UNITE_HABILIT_MER ouhm ON o.off_cle = ouhm.off_cle   
LEFT JOIN R_EQUIPE_PRO rep ON o.ALE_CLE = rep.ALE_CLE
WHERE 
 
(1 = '1' OR ouhm.unit_cle= '') AND
 (1 = '1' OR o.ALE_CLE = '')
AND (1 = '0' OR rep.EQU_PRO_CLE = 3) 
AND (1 = '1' OR ID_E_RCE = 1111111111) 
AND (1 = '1' OR o.OFF_NIV_SER = '') 
AND (1 = '1' OR o.OFF_COD_ORI = '') 
AND (1 = '1' OR o.OFF_ETAT_SAGE = '');
walthwith 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 15h14.


 
 
 
 
Partenaires

Hébergement Web