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 :

2 alias pour une même table et dans une même requête


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 29
    Points : 26
    Points
    26
    Par défaut 2 alias pour une même table et dans une même requête
    Bonjour,

    Voici la requête suivante :

    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
     
     
    select   chg.chg_ref_num "REL ID",
             apr.sym "Skill team",  
             rtrim(ass.c_last_name||' '||ass.c_first_name) "Assignee",
             rtrim(bak.c_last_name||' '||bak.c_first_name) "Backup assignee"     
    from     chg      chg,
             lrel     lnk,
             zce_aprvl apr,
             ctct      ass,
             ctct      bak,
              wftpl     tpl          
    where    chg.chg_ref_num = '766141' -- Filter : change ID
    and      lnk.l_persid    = chg.persid
    and      lnk.l_attr      = 'zimpact_domains'
    and      apr.persid      = lnk.r_persid
    and      apr.sym         != 'change coordination'
    and      ass.id(+)             = tpl.assignee
    and      bak.id(+)             = tpl.zbk_assignee
    and       apr.id(+)             = tpl.zceapdm
    order by chg.open_date desc, 2;
    Dans le select, on a ass.c_last_name ( avec ass qui est alias de la table ctct) et ensuite on a bak.c_last_name ( avec bak qui est aussi alias de la table ctct).
    Quel est l'intêret de créer des alias pour une même table ? Qu'est ce que ça change ?

    Et je voudrais savoir si savez ce que signifie le ' (+) ' ? Par exemple bak.id(+) ? Peut-être que cela a un lien?
    ESt-ce que vous pourriez me dire par la même occasion si ma requête semble correcte et cohérente ?

    Merci pour votre aide.

  2. #2
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Ce "double alias" comme vous l'appelez est là pour gérer la double relation entre votre table wftpl et ctct (via les colonnes assignee et zbk_assignee).
    Les ID de ces colonnes pouvant être différents, mais faisant néanmoins partie de la table ctct, il devient obligatoire de faire 2 jointures pour avoir les différentes valeurs. Si vous ne le faites pas, la requête reviendrait à rechercher une liaison avec ctct.ID = wftpl.assignee ET ctct.ID =wftpl.tpl.zbk_assignee donc wftpl.assignee =wftpl.tpl.zbk_assignee ce qui ne correspond surement pas à la règle fonctionnelle de votre applicatif

    Le symbole (+) est l'indicateur d'une jointure externe implicite. Il est spécifique à ORACLE. Vous pourriez écrire vos requêtes avec des jointures explicites, cela permet d'isoler vos conditions de jointures de vos clauses (INNER et OUTER JOIN).

    Exemple :

    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
    SELECT   chg.chg_ref_num "REL ID",
             apr.sym "Skill team",  
             rtrim(ass.c_last_name||' '||ass.c_first_name) "Assignee",
             rtrim(bak.c_last_name||' '||bak.c_first_name) "Backup assignee"  
    FROM 
    	chg 
    INNER JOIN lrel lnk ON (chg.persid = lnk.l_persid)
    INNER JOIN zce_aprvl apr ON (apr.persid = lnk.r_persid)
    RIGHT OUTER JOIN wftpl tpl ON (apr.id = tpl.zceapdm)
    RIGHT OUTER JOIN ctct ass ON (ass.id = tpl.assignee)
    RIGHT OUTER JOIN ctct bak ON (bak.id = tpl.zbk_assignee)
    WHERE
    	chg.chg_ref_num = '766141'
    	AND lnk.l_attr      = 'zimpact_domains'
    	AND apr.sym         != 'change coordination'
    ORDER BY chg.open_date DESC, 2;
    En ce qui concerne la cohérence, difficile de se prononcer sans un descriptif du modèle, ainsi que des expressions des besoins.

    Bon courage

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    si tu joins une table avec elle-même, il te faut des alias différents

    ex: les couples d'employés avec le même salaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select e1.ename name1, e2.ename name2, e1.sal 
    from emp e1, emp e2 where e1.sal = e2.sal and e1.empno>e2.empno
    NAME1      NAME2             SAL
    ---------- ---------- ----------
    MARTIN     WARD             1250
    FORD       SCOTT            3000

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/07/2013, 08h23
  2. Réponses: 1
    Dernier message: 26/12/2010, 21h20
  3. Réponses: 6
    Dernier message: 08/09/2010, 15h06
  4. Réponses: 1
    Dernier message: 29/07/2009, 22h20
  5. Réponses: 8
    Dernier message: 14/12/2007, 16h04

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