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 :

LEFT JOIN retourne une valeur


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2018
    Messages : 6
    Par défaut LEFT JOIN retourne une valeur
    Bonjour,

    J'ai une requête qui marche presque :

    j'ai une table "client" et "cmde"

    Je voudrais la liste de tous les clients avec la date et prix de leur dernière commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT a.id_client, nom_client, prenom_client, ville_client, date_cmde, heure_cmde, prix_cmde
      FROM client a
     
      left JOIN
      (select * from
          (
               select * from cmde a order by date_cmde, heure_cmde desc
          )
          where rownum=1
      ) c
     
      on c.id_client=c.id_client and a.pays_client='FR'
     
      where a.id_client=55476

    --> Pb : il me renvoie les bonnes lignes sauf que les colonnes date_cmde, heure_cmde, prix_cmde sont à null !!!

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 227
    Par défaut
    order by date_cmde , heure_cmde desc --> order by date_cmde desc, heure_cmde desc
    Pour avoir un tri descendant, mais de toutes façons, ce n'est pas la bonne piste.
    Ici, tu exécutes cette sous-requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select * from
          (
               select * from cmde a order by date_cmde, heure_cmde desc
          )
          where rownum=1
    Les parenthèses autour de cette sous-requête font que c'est un peu comme une boite noire, indépendante de tout ce qu'il y a autour.

    Puis tu fais une jointure entre cette sous-requête et ta table client.
    Lance cette sous-requête toute seule, et tu vas voir ce qu'elle renvoie, et tu vas voir que ce n'est pas la bonne piste.

    Regarde dans les messages récents, il y a une discussion sur une demande très proche : Rechercher la ligne la plus récente pour chaque client.

  3. #3
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    ...Les parenthèses autour de cette sous-requête font que c'est un peu comme une boite noire, indépendante de tout ce qu'il y a autour.
    ....

    Mais pas de tout, c'est juste une inline vue que peut être optimisé comme n'importe quelle autre vue par l'optimiseur d'Oracle!

    Le vrai problème avec cette requête est qu'elle est erronée! Pourriez-vous voir pourquoi ? De plus la solution envisagée est inefficace!

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2018
    Messages : 6
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    left JOIN
      (select * from
          (
               select * from cmde a order by date_cmde, heure_cmde desc
          )
          where rownum=1
      ) c
    le pb vient de cette sous-requête qui renvoie toutes les lignes alors que je ne veux que la ligne avec id_client
    donc à l'arrivée me renvoie null

    Quelle est la solution ?

  5. #5
    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 jp3871 Voir le message
    le pb vient de cette sous-requête qui renvoie toutes les lignes
    Euh, non, c'est l'inverse, cette sous requête renvoie 1 seule ligne : La toute dernière commande de la table.

    Pour récupérer les infos de la dernière commande d'un client, 2 solutions :
    Soit une jointure entre CLIENT et CMD avec un groupement sur les clients et la fonctions KEEP

    https://www.developpez.net/forums/d1.../#post10577232

    Soit une jointure sur CLIENT et CMD, avec une condition sur CMD pour récupérer la dernière commande (la sous requête devant correspondre à 1 seule commande c'est à dire qu'il ne faut pas qu'il y ait 2 commandes d'un client avec la même date et heure)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      SELECT *
      FROM client c, cmd a
      WHERE ....
      AND (a.datecmde+heure) = (SELECT MAX (b.date_cmde+heure) FROM cmd b WHERE b.client = c.client)

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2018
    Messages : 6
    Par défaut
    Bonjour,

    Oui ca va marcher mais moi, je voudrais afficher le client meme si il n'a pas de facture... d'ou le left join

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

Discussions similaires

  1. Comment ne pas retourner une valeur nulle sur une requête SQL
    Par DedeLaMouche dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/03/2017, 08h25
  2. Réponses: 7
    Dernier message: 15/03/2005, 14h44
  3. [PL/SQL] Fonction qui retourne plusieurs valeurs
    Par Loko dans le forum Oracle
    Réponses: 2
    Dernier message: 07/12/2004, 09h43
  4. fonction retournant une valeur
    Par ryan dans le forum ASP
    Réponses: 4
    Dernier message: 06/09/2004, 17h45
  5. Retourner une valeur avec une fonction
    Par stephtbest dans le forum ASP
    Réponses: 4
    Dernier message: 31/10/2003, 16h37

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