Bonsoir,

je souhaiterais proposer diverses langues à mes visiteurs. Pour se faire j'impose une langue de référence (anglais - en) et propose diverses autres dont la traduction est souhaitable (français - fr, par exemple).

Ainsi souhaiterais-je via une requête recueillir l'ensemble des catégories présentes dans la base de donnée pour une langue donnée (pour l'exemple, français). Toutefois, s'il venait à manquer une traduction, je souhaiterais que la requête aille piocher dans la langue de référence, l'anglais (qui se doit d'être complète).

Pourriez-vous m'aider à optimiser ce gouffre à performances ?
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
22
23
24
25
26
27
SELECT 
  JB.JB__LC.I,
  JB.JB__LC.N
FROM
  JB.JB__LC
WHERE
  JB.JB__LC.C = 'fr'
 
UNION
 
SELECT 
  JB.JB__LC.I,
  JB.JB__LC.N
FROM
  JB.JB__LC
WHERE
  JB.JB__LC.C = 'en' AND
  JB.JB__LC.I
 
  NOT IN
 
  (SELECT
  JB.JB__LC.I
  FROM
  JB.JB__LC
  WHERE
  JB.JB__LC.C = 'fr')
Voici le schéma des deux tables :

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
Oracle Express Edition - indexé et contraint comme il se doit.
 
JB__SC (comme JB__Structure of categories, simple hièrarchie id/parent_id) :
 
"I";"P" - Id, parent_id.
"1";"0"
"2";"1"
"3";"1"
"4";"3"
 
JB__LC (comme JB__Localized Categories, ensemble des traductions) :
 
"I";"N";"D";"C" - Id, nom, description, code langue.
"1";"Produits";"null";"fr"
"2";"Fleurs";"null";"fr"
"3";"Graines";"null";"fr"
"1";"Products";"null";"en"
"2";"Flowers";"null";"en"
"3";"Seeds";"null";"en"
"4";"Herb seeds";"null";"en" <= veuillez noter que 4 n'a pas de traduction francophone.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
Résultat espéré :
"1";"Produits"
"2";"Fleurs"
"3";"Graines"
"4";"Herb seeds"
Question subsidiaire : habitué de Firebird, j'utilisais jusqu'alors la représentation intervallaire pour classer un arbre (bornes gauche/droite), toutefois Oracle semble proposer une fonction native pour parcourir ceux-ci (Start with / connect by), est-ce plus performant ? Ou peut-être existe-t-il une méthode encore plus performante via Oracle ?

N'hésitez pas à me conseiller des tutoriels/livres/.sql sur ces deux "problèmes" (plurilinguisme et hièrarchie) sous Oracle, Google me boude.

Merci beaucoup pour votre aide.