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 :

problème de requête imbriquées


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    423
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 423
    Points : 303
    Points
    303
    Par défaut problème de requête imbriquées
    salut,
    j'ai une requête de la format suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    select att1, att2, ...
    from
    (
    select at1 as att1, ....
    from table1
    ),(
    select at2 as att2, ....
    from table2
    )


    le problème est le suivant : quand l'un des select imbriquées retourne null comme résultats et l'autre non le résultat de la requête totale est aussi null malgré que l'autre select imbriqué retourne un résultat valide?!!!

  2. #2
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut imbriquées comment ?
    Peux tu soumettre ton sql complet car je vois aucune jointure ...
    et c'est là que tu peux, me semble-t-il agir ...
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

  3. #3
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    423
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 423
    Points : 303
    Points
    303
    Par défaut
    salut,
    parfois, on ne peut collecter les données qu'on cherche à partir d'une seule requête select (c'est souvent le cas des requetes des count et des sum de tables différentes) c'est pourquoi on est obliger d'imbriquer des requêtes
    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    select code_abonne, nom
    from
    (
    select code_abonne
    from abonne
    ),(
    select nom_livre
    from livre
    )
    et mon cas ressemble beaucoup (le code est un peut compliqué mais c'est le même cas que l'exemple) à ce cas donc il n'y a pas de jointure dans la requête entre les deux select imbriquées mon problème est le suivant :
    quand code_abonne est null et nom_livre ne l'est pas ou bien le contraire le résultat affiché est null ce qui est vraiment incompréhensible!!????
    je veux afficher le résultat même si l'un seux est null.

  4. #4
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    Salut,

    La réponse est dans la définition du produit cartésien :
    http://www.alefranc.com/polyproba/node12.html

  5. #5
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    423
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 423
    Points : 303
    Points
    303
    Par défaut
    salut,
    y'a pas un moyen pour résoudre ce problème?

  6. #6
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut null ça se gère
    Salut,
    Soyons cartésien jusqu'au bout ...
    Pourquoi ne pas essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <div style="text-align: left;">select abonné, livre
    from
    (
    select nvl(code_abonne,'?') abonné
    from abonne
    ),(
    select nvl(nom_livre,'??') livre
    from livre
    )</div>
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

  7. #7
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    Citation Envoyé par BRUNO2R
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <div style="text-align: left;">
    (
    select nvl(code_abonne,'?') abonné
    from abonne
    )</div>
    Est ce que tu as exécuté la sous-requette ci-dessus quand la table abonne est vide ?

    Voici un exemple, ma table p1 est vide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    SQL> select nvl(col1,'?') from p1 ;
     
    no rows selected
    A quoi sert ton produit cartésien entre les tables livre et abonne?

  8. #8
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    423
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 423
    Points : 303
    Points
    303
    Par défaut
    salut,
    Citation Envoyé par BRUNO2R
    Salut,
    Soyons cartésien jusqu'au bout ...
    Pourquoi ne pas essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <div style="text-align: left;">select abonné, livre
    from
    (
    select nvl(code_abonne,'?') abonné
    from abonne
    ),(
    select nvl(nom_livre,'??') livre
    from livre
    )</div>
    j'ai essayer cela est c'est toujours la même chose.

  9. #9
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut je jette l'éponge
    Je ne crois pas pouvoir vous aider ne comprenant toujours pas l'objectif poursuivi ... un produit cartésien entre deux tables dont l'une peut être vide ! ??? Quelle est leur structure respective à ces deux tables ? On veut obtenir quoi au juste ?
    Il me semble pourtant qu'avec l'utilisation de nvl le select ramène autant de lignes qu'il y a d'enregistrements dans chaque table et que le produit cartésien devrait se faire.
    On pourrait pas avoir un exemple des données de chaque table et du résultat obtenu et même du résultat escompté.
    A +
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

  10. #10
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    423
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 423
    Points : 303
    Points
    303
    Par défaut
    salut,
    merci pour vos réponses.
    je vais expliquer mon besoin malgrès que j'ai résolu le problème d'une autre façon.
    on doit récupérer des informations conçernants les factures impayées (nombre total des factures émises, nombre total des factures émises et impayées, montant des factures émises et impayées, ...) donc c'est que des sum et des count alors la requête contiendra sûrement des select imbriqué car c'est difficile d'avoir plusieurs count et sum dans une seule requête (ça c'est pour une date). après je doit réaliser la même chose pour la date précédente - 1 mois et - 2 mois. la requête va être executer dans un outil de reporting (ireport) qui ne permet pas la saisie de plusieurs requêtes pour un seul rapport. donc l'idée était d'imbriqué la même requête 3 fois avec des conditions sur la date différentes mais, il est fort probable que l'une des requêtes imbriquées retourne null pour l'une des dates donc les résultats des autres requêtes ne seront pas affichés.
    c'est des cas pratiques qu'on rencontre souvent.

  11. #11
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    Salut ,

    T'as pas une table reglement ( .... montant reglement) des factures?

    Pour extraire les factures des trois derniers mois, tu utilises un produit cartésien bizarre ???????

    Tu peux poster ton code ?

  12. #12
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut Oh oui montre nous ton code sinon ne ne saura jamais
    Pourquoi plusieurs sql pour compter plusieurs cas de figure ?
    Imaginons (car tu es plutôt avare en infos) une table facture comportant notamment des champs datefac, numfac, valfac, valregle
    Je te propose
    Code : 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
     
    SELECT 
    D.madate,
    sum(decode(F.numfac,null,0,1) as nbfactemises,
    sum(decode(F.valfac,null,0,valregle,1,0) as nbfactreglees,
    sum(decode(F.valfac,null,0,decode(F.valregle,null,1,0)) as nbfactimpayees
    FROM facture F, 
    (select to_date('datechoisie','dd/mm/yyyy') madate FROM dual) D
    WHERE D.madate = F.datefac(+)
    UNION
    D.madate,
    sum(decode(F.numfac,null,0,1) as nbfactemises,
    sum(decode(F.valfac,null,0,valregle,1,0) as nbfactreglees,
    sum(decode(F.valfac,null,0,decode(F.valregle,null,1,0)) as nbfactimpayees
    FROM facture F, 
    (select add_months(to_date('datechoisie','dd/mm/yyyy'),-1) madate FROM dual) D
    WHERE D.madate = F.datefac(+)
    UNION
    D.madate,
    sum(decode(F.numfac,null,0,1) as nbfactemises,
    sum(decode(F.valfac,null,0,valregle,1,0) as nbfactreglees,
    sum(decode(F.valfac,null,0,decode(F.valregle,null,1,0)) as nbfactimpayees
    FROM facture F, 
    (select add_months(to_date('datechoisie','dd/mm/yyyy'),-2) madate FROM dual) D
    WHERE D.madate = F.datefac(+)
    Eh les amis vérifiez que je n'ai rien oublié j'ai pas encore bu mon café
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

Discussions similaires

  1. [MySQL] Problème de requête imbriquée (mysql) & php
    Par niacinside dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 21/05/2008, 10h59
  2. Problème de requêtes imbriquées, possible sous Access ?
    Par PierrePM dans le forum Requêtes et SQL.
    Réponses: 17
    Dernier message: 14/11/2007, 19h45
  3. problème sur requête imbriqué
    Par Dam1en dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/10/2007, 16h55
  4. [MySQL] problème de requête imbriquée
    Par amarcil dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 28/04/2007, 15h04
  5. [MySQL] problème de requêtes imbriquées
    Par xave dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 24/01/2007, 13h30

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