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 :

Requete SQL incluant aussi les lignes absentes


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut Requete SQL incluant aussi les lignes absentes
    Bonjour.

    Je possède deux table COMMANDE et RECEPTION. La PK de la table commande est NUM_COMMAND, et la table RECEPTION possède un champ NUM_COMMAND afin de la rattaché à une commande. la table RECEPTION ne comprend que des enregistrent correspondant à une commande. Par exemple je passe 10 commandes, au fur et a mesure des réception la table RECEPTION contiendra de 0 à 10 enregistrements (chacun correspondant a une commande).

    Je souhaite afficher les réceptions, ainsi que les réceptions manquantes, je réalise donc la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Select distinct /*[liste des champs]*/
    FROM RECEPTION R, COMMANDE C
    where c.NUM_COMMAND = r.NUM_COMMAND(+) 
    and C.DATE_COMMAND < '03/03/2009'
    and C.DATE_COMMAND  >= '02/03/2009'
    --and R.STATUT_RECEPTION in (0,1,2,3)
    --and R.SIGNATURE is not null
    La requête suivante fonctionne parfaitement (avec les lignes en commentaires). Je souhaiterais maintenant enlever les réceptions sans signature et les réceptions ayant un statut de réception compris entre 0 et 3.

    Lorsque j'enlève les 2 lignes en commentaires, mes commandes non-réceptionnées n'apparaissent plus (ce qui est normal), et je ne vois pas comment les conserver tout en filtrant en plus les RECEPTION.

    J'espère que ma question est suffisamment clair, j'ai eu un peu de mal a exposé mon problème!

    Merci d'avance a tous ceux qui pourront m'aider!

  2. #2
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Pour les signature ca fonctionne en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT /*[liste des champs]*/
    FROM RECEPTION R, COMMANDE C
    WHERE c.NUM_COMMAND = r.NUM_COMMAND(+) 
    AND C.DATE_COMMAND < '03/03/2009'
    AND C.DATE_COMMAND  >= '02/03/2009'
    --and R.STATUT_RECEPTION in (0,1,2,3)
    and R.SIGNATURE(+) is not null
    mais pour le STATUT RECEPTION j'ai une erreur si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT /*[liste des champs]*/
    FROM RECEPTION R, COMMANDE C
    WHERE c.NUM_COMMAND = r.NUM_COMMAND(+) 
    AND C.DATE_COMMAND < '03/03/2009'
    AND C.DATE_COMMAND  >= '02/03/2009'
    and R.STATUT_RECEPTION(+) in (0,1,2,3)
    and R.SIGNATURE(+) is not null

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Utilisez la jointure normalisée, c'est vraiment dans ce genre de cas qu'elle est avantageuse (et comparez des dates avec des dates) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT /*[liste des champs]*/
    FROM
        RECEPTION R RIGHT OUTER JOIN COMMANDE C
          ON c.NUM_COMMAND = r.NUM_COMMAND
         AND R.SIGNATURE IS NOT NULL
         AND R.STATUT_RECEPTION IN (0,1,2,3)
    WHERE C.DATE_COMMAND < date '2009-03-03'
    AND C.DATE_COMMAND  >= date '2009-03-02'

  4. #4
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Merci de ta reponse!

    En faite j'ai d'autres tables qui entrent en jeu, et donc je n'arrive pas a écrire ma requête comme il faut en utilisant l'écriture normée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT /*[liste des champs]*/
    FROM RECEPTION R, COMMANDE C, FOURNITURE F
    WHERE c.NUM_COMMAND = r.NUM_COMMAND(+) 
    AND C.DATE_COMMAND < '03/03/2009'
    AND C.DATE_COMMAND  >= '02/03/2009'
    --and R.STATUT_RECEPTION in (0,1,2,3)
    AND R.SIGNATURE(+) IS NOT NULL
    AND R.CODE_FOURNITURE = F.CODE_FOURNITURE(+)
    J'ai donc écris (mais ça ne fonctionne pas) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT DISTINCT /*[liste des champs]*/
    FROM
        RECEPTION R RIGHT OUTER JOIN COMMANDE C
          ON c.NUM_COMMAND = r.NUM_COMMAND
         AND R.SIGNATURE IS NOT NULL
         AND R.STATUT_RECEPTION IN (0,1,2,3)
    , FOURNITURE F
    WHERE C.DATE_COMMAND < '03/03/2009'
    AND C.DATE_COMMAND  >= '02/03/2009'
    AND R.CODE_FOURNITURE = F.CODE_FOURNITURE

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Alors on normalise jusqu'au bout !
    Attention l'ordre entre commande et reception est interverti, le type de jointure est passé de right join à left join.
    Et j'insiste toujours sur les dates !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT DISTINCT
        /*[liste des champs]*/
    FROM
        COMMANDE C
        LEFT OUTER JOIN RECEPTION R
          ON R.NUM_COMMAND = C.NUM_COMMAND
         AND R.SIGNATURE IS NOT NULL
         AND R.STATUT_RECEPTION IN (0,1,2,3)
        LEFT OUTER JOIN FOURNITURE F
          ON F.CODE_FOURNITURE = R.CODE_FOURNITURE
    WHERE
        C.DATE_COMMAND >= to_date('02/03/2009', 'dd/mm/yyyy')
    AND C.DATE_COMMAND <  to_date('03/03/2009', 'dd/mm/yyyy')

  6. #6
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Merveilleux!

    Après quelques adaptation dans mon code ta solution fonctionne à merveille!

    J'ai encore beaucoup (beaucoup, beaucoup, beaucoup!!) de mal avec les jointure "officielle"...

    En tout cas merci de t'être penché sur mon problème et d'avoir pris le temps d'y répondre!

    Pour les date, j'ai bien noté la modification.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/08/2009, 22h14
  2. Réponses: 1
    Dernier message: 15/05/2007, 18h31
  3. Réponses: 5
    Dernier message: 15/05/2007, 17h19
  4. [VBA-E] Requete SQL incluant des donnees provenant de cells
    Par Tartenpion dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/03/2006, 19h16
  5. probleme avec requete sql aime pas les strings
    Par lil_jam63 dans le forum Bases de données
    Réponses: 3
    Dernier message: 24/02/2004, 15h45

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