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
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  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