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 :

Utilisation de colonnes dans une sous-requête


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2006
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Utilisation de colonnes dans une sous-requête
    Bonjour à tous,
    je voudrais passer une colonne d'une requete principale dans une sous requête imbriquée.

    Explication. J'ai une bd qui gère des commandes, chaque commande à plusieurs états (annulé, confirmée, payée, expédiée,livrée etc...). Ceci est dans une table ou il y a l'id_commande, l'id_etat la date de l'attribution de l'état. Je voudrais donc toute les commandes dont le dernier état est 3 (expédiée).
    Et bien je n'y arrive pas.

    Je fais cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select lce.id_commande id_cde from l_commande_etat lce
     where (select * from (select id_etat from l_commande_etat
               where l_commande_etat.id_commande=id_cde ORDER BY
               date_commande_etat desc) where rownum = 1) = 3;
    J'ai un message d'erreur qui me dit id_cde identificateur non valide.
    Quand je fais juste la sous requete suivante avec un id_cde fixé à 1000 par exemple, j'ai bien un résultat avec id_etat de 3.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select * from (select id_etat from l_commande_etat
                    where l_commande_etat.id_commande=id_cde
                    ORDER BY date_commande_etat desc) where rownum = 1
    Comprenez-vous mon problème ? je voudrais en fait qu'au lieu de 1000 ce soit id_cde et donc qu'au lieu de faire la requete que pour une commande je voudrais toutes les commande avec comme dernier état en date l'état 3

    Je n'arrive pas à trouver comment faire, merci de votre aide.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Il y a plusieurs solutions à votre problème.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    With commande_tmp as
    (
    SELECT id_commande,
           id_etat,
           row_number() over(partition by id_commande order by date_commande_etat DESC) as rn
      FROM l_commande_etat
    )
    SELECT id_commande
      FROM commande_tmp
     WHERE rn = 1
       AND id_etat = 3;

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2006
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Merci
    Merci beaucoup, même si je ne comprends pas tout dans la façon de faire (je précise que je ne suis pas dba mais simple développeur php).
    Je vais essayer de comprendre plus tard.

    J'ai tout de même un problème qui persiste. Je voudrais pouvoir aussi rajouter d'autres conditions de recherche. Le but finale étant de faire un moteur de recherche de commande en fonction d'une date de commande, d'une référence de commande d'un nom de client et enfin d'un état de commande. Jusque là j'avais réussi à faire toutes les recherches couplées sauf en fonction de l'état. Comment puis-je coupler la recherche d'un état avec les autres conditions sachant que la référence, la date sont dans une table commande et que le nom du client se trouve dans une table client et l'id du client se trouve dans la table client. Jusqu'à maintenant, je faisais cette recherche (considérant que tous les critères de recherche ont été saisis) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT tc.id_commande id_cde, TO_CHAR(date_commande,'DD/MM/YYYY HH24:MI') date_commande,
     tc.id_client,ref_commande,nom_client
     FROM t_commande tc, t_client
     WHERE tc.id_client=t_client.id_client AND ref_commande = 'ref45'
     AND TO_CHAR(date_commande,'DD-MM-YYYY') = '28-05-2010'
     AND (UPPER(CONVERT(nom_client, 'US7ASCII')) LIKE UPPER(CONVERT('%dupond%', 'US7ASCII')) 
        OR UPPER(CONVERT(prenom_client, 'US7ASCII')) LIKE UPPER(CONVERT('%dupond%', 'US7ASCII')))
    Je demande parce que je ne comprend ni la syntaxe ni la forme de ta réponse mais qui fonctionne seul !

    Peut être une autre solution, vous disiez qu'il y en avait plusieurs ?

    Merci d'avance

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2006
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Un grand merci
    à toi Waldar ! J'ai posté un peu vite mon poste précédent, et je n'avais pas pris vraiment le temps d'analyser la 2ieme partie de ta réponse, j'arrive donc maintenant à faire ma requête avec les autres paramètres.

    Bonne journée et encore merci !

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 388
    Points
    18 388
    Par défaut
    N'hésitez pas à publier votre requête qui fonctionne, ça servira aux lecteurs de ce sujet !

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2006
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Effectivement je peux montrer ma requête même si l'essentiel est dans ta réponse, j'ai juste enlevé le bloc WITH qui ne me servait pas tel quel et l'ai intégré dans la sous requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT tc.id_commande,date_commande ...
      FROM t_commande tc, t_client tcl
       WHERE tc.id_client=tcl.id_client
       AND ref_commande = 'xxx'
       AND TO_CHAR(date_commande,'DD-MM-YYYY') = '31-05-2010' 
       ...
       AND tc.id_commande IN
         (SELECT id_commande 
            FROM 
              (SELECT id_commande, id_etat, row_number() over(partition BY
                    id_commande ORDER BY date_commande_etat DESC) AS rn
               FROM l_commande_etat) WHERE rn = 1 AND id_etat = 1)
    Bonne journée à tous

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

Discussions similaires

  1. Utilisation de Having dans une sous-requête
    Par ultimus dans le forum Langage SQL
    Réponses: 6
    Dernier message: 18/05/2014, 23h01
  2. [DI] Création de colonne dans une Sous - Requête
    Par jmarandet dans le forum Outils BI
    Réponses: 3
    Dernier message: 12/03/2013, 14h12
  3. Utiliser une liste de valeurs dans une sous-requête
    Par sagopa dans le forum Requêtes
    Réponses: 12
    Dernier message: 30/04/2012, 11h08
  4. impossible d'utiliser LIMIT 1 dans une sous-requête
    Par Christophe Charron dans le forum Requêtes
    Réponses: 13
    Dernier message: 19/12/2009, 22h42
  5. Ramener plusieurs champs dans une sous requête...
    Par David.V dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 12/01/2005, 07h54

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