IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

SQL - Jointures - Nombre de résultats différents


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 7
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!

  2. #2
    Invité
    Invité(e)
    Par défaut
    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' ??

  3. #3
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par McM Voir le message
    Euh.. non ce n'est pas vrai..
    Exemple et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 7
    Par défaut
    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


    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.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 7
    Par défaut
    Bonjour à tous!

    Des LEFT JOIN suffisaient, au final...

    Merci de vos réponses!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 = '');

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/05/2014, 21h01
  2. [SQLK][T-SQL]Limitation du nombre de résultats
    Par elsuket dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 10/08/2007, 08h02
  3. [SQL] Nombre de résultats par pays
    Par flOZ dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 31/05/2006, 05h29
  4. [sql]Limiter le nombre de résultats
    Par Mimo dans le forum Oracle
    Réponses: 3
    Dernier message: 31/01/2006, 15h53
  5. Résultats différent entre une requête SQL, et la même en VBA
    Par thetaps dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 23/09/2005, 12h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo