Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/08/2011, 09h08   #1
Invité de passage
 
Inscription : avril 2007
Messages : 16
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 16
Points : 1
Points : 1
Par défaut 2 alias pour une même table et dans une même requête

Bonjour,

Voici la requête suivante :

Code :
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.
corro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2011, 09h43   #2
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
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 :
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)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 11h00   #3
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 926
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 926
Points : 4 547
Points : 4 547
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 :
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
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h32.


 
 
 
 
Partenaires

Hébergement Web