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 requête imbriquée dans un Decode


Sujet :

SQL Oracle

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Problème requête imbriquée dans un Decode
    Bonjour,

    Je suis débutant dans le SQL sous oracle et je me retrouve face à un problème que je n'arrive pas à résoudre. Je n'arrive pas bien non plus à formuler un intitulé à mon problème car je ne suis pas bien sûr qu'il vienne de ma requête imbriquée, voire même qu'une requête imbriquée soit nécessaire ...

    J'ai deux tables c_int et c_con_int contenant plusieurs champs:

    c_int: in_codint (le code de l'intervenant)/ ( d'autres champs sans importance que j'utiliserai pour mettre en forme avec des concat, genre nom prenom etc...)
    c_con_int: cn_condint/cn_codresp ( le responsable de l'intervant, tous les responsables sont aussi intervenants et ont donc un codint)/cn_ordre ( l'ordre hiérarchique du responsable, il va de 1 à 2 mais peut etre null)

    Mon but est d'afficher les différents responsables, les intervenants qu'ils gèrent et si ils gèrent un intervenant au niveau 2, je dois afficher le responsable numero 1 de cet intervenant.

    Voici pour l'instant ma requête :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select 
    gestio.in_codint,
    cn_ordre,
    interv.in_codint,
    decode(cn_ordre,2, gestio.in_codint,
    (select gestio.in_codint from c_con_int Join c_int interv on interv.in_codint=cn_codint Join c_int gestio on gestio.in_codint = cn_codresp where cn_ordre=1 and (select in_codint from c_int )=interv.in_codint),'')
    from c_con_int
    Join c_int interv on interv.in_codint=cn_codint
    Join c_int gestio on gestio.in_codint = cn_codresp
    where cn_ordre is not null ;

    Elle me renvoie l'erreur "sous-requête ramenant un enregistrement de plus d'une ligne" mais je n'arrive pas à afficher spécialement le codint du responsable uniquement

    Voila, j'espère avoir été clair, j'aimerais une piste de reflexion, un indice car je bloque sur cette requête depuis un moment.

    Merci d'avance

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 789
    Points
    30 789
    Par défaut
    Ta requête pose plusieurs problèmes :
    1. En ne qualifiant (préciser la table d'origine) pas toutes les colonnes utilisées dans la requête et la sous-requête, il y a un risque d'ambiguïté.
    2. Tu utilises des sous-requêtes scalaires (sous-requête retournant une seule valeur, dans la clause SELECT ou la clause WHERE). Si elles retournent plus d'une ligne, la requête tombe en erreur.
    3. La requête scalaire utilisée dans le DECODE n'est pas liée à la requête principale... Cela signifierait-il que la valeur retournée est unique et constante ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour la rapidité de votre réponse

    1- Mais le fait que je mette gestio. et interv. ne permettent pas d'éviter les ambiguïtés ? Je mets donc le reste des colonnes dans mon select.

    2- Oui la est mon problème, je voudrais faire en sorte que ma sous requête affiche le responsable numéro 1 de mon intervenant. Mais je crois que ma sous requête renvoie tous les responsables 1.

    3- Je dois donc les lier avec un UNION ? Non la valeur retournée ne doit pas être une constante mais variable pour chaque intervenant (interv.in_codint) différent. J'ai essayé auparavant mais sans réussite, j'ai du mal m'y prendre, je réessaye donc.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 789
    Points
    30 789
    Par défaut
    Ce qui manque pour pouvoir t'aider, c'est la structure (simplifiée) de tes tables avec leurs relations, quelques lignes de jeu d'essai et un exemple du résultat attendu.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Je viens de finir ma requête, j'arrive dorénavant à afficher ce que je souhaitais mais il me reste encore des petits problèmes (minimes) sur mes CONCAT.

    Un peu de précision sur mes tables:
    -Il y a deux rôles différents pour chaque individu, être intervenant ou gestionnaire, certain sont les deux.
    -Le gestionnaire gère un ou plusieurs interventants, chaque gestionnaire est au moins une fois intervenant.
    -Il y a des types différents de gestionnaire mais cela nous importe peu, on ne prend en compte qu'un seul type 'GEST'
    -Les intervenants ont plusieurs gestionnaires qui ont un ordre hiérachique, 1 et 2. Le 1 étant le gestionnaire principal et unique de l'intervenant.

    Leurs champs:
    -les intervenant : in_codint (leur code), in_nomint, in_prenomint
    -les gestionnaires : cn_codint( le code de l'intervenant), cn_ordre ( leur ordre hierarchique), cn_resp (le code du gestionnaire), cn_typresp( le type, sans importance)

    Il y a deux tables c_int et c_con_int, la premiere pour gérer les intervants la seconde pour les gestionnaires.

    Ce que je veux afficher:

    Je veux afficher un gestionnaire et tous les intervenants qu'il gère, que ce soit de niveau 1 et 2. Ensuite ma requête doit afficher le gestionnaire numéro 1 d'un intervenant quand notre gestionnaire est le gestionnaire 2:


    Gestionnaire | Intervenant | Ordre hierarchique | Si ordre =2, Gestionnaire numéro 1 de l'intervenant

    Ma requête renvoie bien ça j'y suis arrivé, mais j'ai du mal à concaténer ma derniere colonne car je demande le cn_codresp et non le codint:


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select 
    CONCAT(concat(gestio.in_prenomint,' '),gestio.in_nomint),
    cn_ordre,
    CONCAT(concat(interv.in_prenomint,' '),interv.in_nomint),
    decode(cn_ordre, 2, (select cn_codresp from c_con_int where cn_ordre = 1 and cn_codint = interv.in_codint and CN_TYPRESP = 'GEST'),'')
    from c_con_int
    Join c_int interv on interv.in_codint=cn_codint
    Join c_int gestio on gestio.in_codint = cn_codresp
    where cn_ordre is not null
    and cn_typresp = 'GEST'
    order by gestio.in_codint;

    Reste uniquement le problème de concaténer pour obtenir le nom et prénom du responsable 1 de ma dernière colonne. Car pour l'instant la requête ne renvoie que son code.

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

Discussions similaires

  1. Problème avec des requète imbriquée dans le from
    Par Stouille33 dans le forum Développement
    Réponses: 5
    Dernier message: 23/10/2008, 19h17
  2. Problème Requête Imbriquée
    Par PaulPersonne820 dans le forum Hibernate
    Réponses: 1
    Dernier message: 31/01/2007, 22h40
  3. Problème Requête imbriquée
    Par EddieN dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/10/2006, 07h52
  4. problème requête between dans access
    Par Vodkha dans le forum Bases de données
    Réponses: 2
    Dernier message: 15/09/2005, 07h50
  5. Problème requête SQL dans page ASP
    Par rocs dans le forum ASP
    Réponses: 14
    Dernier message: 26/07/2005, 15h38

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