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 Anywhere Sybase Discussion :

Jointures externes sous ASA


Sujet :

SQL Anywhere Sybase

  1. #1
    Futur Membre du Club
    Jointures externes sous ASA
    Bonjour,

    Suite à une migration de version de SQL Anywhere(5->10) je dois réécrire certaines procédures stockées.

    J'ai notamment quelques problèmes sur les procédures qui utilisent des jointures externes.
    En effet celle ci avaient été écrites avec les symboles "*=" et "=*" qui ne sont plus acceptés dans la nouvelle version de ASA.

    Je trouve beaucoup de tutoriels qui expliquent comment faire des jointures externes avec la syntaxe normalisée des jointures mais c'est à chaque fois entre deux tables.

    Comment doit on écrire quand on a plusieurs tables?


    Exemple :
    Table1:Champ1,Champ2,Champ3
    Table2:Champ2
    Table3:Champ3,Champ4
    Table4:Champ4

    Solution?
    Select *
    From
    Table1 t1 LEFT OUTER JOIN Table2 t2
    ON t1.Champ2 = t2.Champ2,
    Table1 t1 LEFT OUTER JOIN Table3 t3
    ON t1.Champ3 = t3.Champ3,
    Table3 t3 LEFT OUTER JOIN Table4 t4
    ON t3.Champ4 = t4.Champ4
    [...]?

  2. #2
    Membre chevronné
    Si on veut passer de la syntax "Sybase" à la syntax ANSI, fait qqch comme cela

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select ...
    from t1, t2, t3, t4
    where t1.id = t2.id
    and t1.id = t3.id
    and t4.toto = t3.toto
    and ... -- autres conditions


    devient

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select ...
    from t1
    join t2 on t2.id = t1.id
    join t3 on t3.id = t1.id
    join t4 on t4.toto = t3.toto
    where ... -- autres conditions


    On ajoute "left outer" si la jointure est une jointure externe.

    Plus généralement je conseille fortement l'utilisation de la syntax ANSI - c'est nettement plus lisible lors de jointures un peu complexes...

    Michael
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

  3. #3
    Futur Membre du Club
    Citation Envoyé par mpeppler Voir le message
    Si on veut passer de la syntax "Sybase" à la syntax ANSI, fait qqch comme cela

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select ...
    from t1, t2, t3, t4
    where t1.id = t2.id
    and t1.id = t3.id
    and t4.toto = t3.toto
    and ... -- autres conditions


    devient

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select ...
    from t1
    join t2 on t2.id = t1.id
    join t3 on t3.id = t1.id
    join t4 on t4.toto = t3.toto
    where ... -- autres conditions


    On ajoute "left outer" si la jointure est une jointure externe.

    Plus généralement je conseille fortement l'utilisation de la syntax ANSI - c'est nettement plus lisible lors de jointures un peu complexes...

    Michael
    C'est là où j'ai un peut de difficultés avec cette nouvelle syntaxe pour lire correctement ce qui a été codé.


    Dans un premier passage je lirais :
    -la table t1 que l'on joint à t2 avec la condition t2.id=t1.id
    -la table t1 que l'on joint à t3 avec la condition t3.id=t1.id
    -la table t1 que l'on joint à t4 avec la condition t4.toto=t3.toto


    Alors qu'après quelque minutes d'analyse de l'exemple j'en viens à cette lecture :
    - la table t1 n'a au début pas de condition de jointure particulière
    - on joint la table 2 à la table 1 avec la condition t2.id=t1.id
    - on joint la table 3 à la table 1 avec la condition t3.id=t1.id
    - on joint la table 4 à la table 3 avec la condition t4.toto=t3.toto



    Maintenant imaginons que nous ayons cet exemple :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select ...
    from t1
    join t2 on t2.id = t1.id
    join t3 on t3.id = t1.id
    left outer join t4 on t4.toto = t3.toto
    where ... -- autres conditions

    Comment le moteur analyse la jointure externe qu'il faut réaliser?
    Grâce à la position des champs dans la condition ON?
    Grâce à la table dont on veut faire la jointure?
    Si c'est un left outer join alors cela équivaut à t4.toto *= t3.toto?
    Si c'est un right outer join alors cela équivaut à t4.toto =* t3.toto?

  4. #4
    Membre du Club
    Personnellement, je n'ai jamais utilisé l'ancienne syntaxe, donc je ne peux pas trop te dire l'équivalence. En revanche tu peux facilement savoir comment est analysée et traitée ta requête avec l'affichage du plan dans iSQL. Il te suffit de taper ta requête et de faire Shift+F5 (ou menu SQL et Accéder au plan).
    Très pratique pour optimiser les requêtes