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

Optimisations SGBD Discussion :

Rapidite de traitement par jointure ou par fonction


Sujet :

Optimisations SGBD

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Points : 94
    Points
    94
    Par défaut Rapidite de traitement par jointure ou par fonction
    Bonjour,
    J'ai une grosse requete impliquant une dizaine de table ( la 1ere possedant 3 cles etrangere, et la requete veut recuperer des champs de ces 3 tables) et des trucs dans le genre.

    Actuellement, je me pose la question de rapidite de traitement.
    Existe-t-il un moyen plus rapide que 10 requetes imbriques ? Comme par exemple l'utilisation de fonction pour chaque table ?

    Merci d'avance

    Julien

    EDIT :
    Voici la query
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    SELECT wojcsitecattyfrmn.*,
            lh.HONO,lh.HOURS,lh.RATE
    FROM
    (
      SELECT wojcsitecatty.*,frmn.JC_FOREMANDESC
      FROM
      (
        SELECT wojcsitecat.*,ty.JTY_DESC
        FROM 
        (
          SELECT wojcsite.*,cat.JC_CATEGORYDESC
          FROM
          (
            SELECT wojc.*,site.DEST_LIB
            FROM
            (
              SELECT wo.*,
                      jc.JC_CATEGORYCODE,jc.JC_DATECREATE,jc.JC_FOREMANCODE,jc.JC_JOBDESC,
                      jc.JC_JOBTYPE,jc.JC_JOBSEQNO
              FROM
              (
                SELECT 
                    A.WO_WORKORDERNO, A.WO_SITECODE,A.WO_FROMSITECODE, A.WO_ASSETCODE,B.PL_DESC,
                    A.WO_DATECREATE, A.WO_DATESTART, A.WO_DATEEND, A.WO_DATECLOSE,B.PL_BRAND
                FROM WorkShop.PLTWKORD as A with (nolock)
                  Left Outer Join WorkShop.PLTPLANT as B with (nolock)
                    On B.PL_CODE = A.WO_ASSETCODE
                WHERE A.WO_DATECREATE >= Convert(DateTime,'01/01/2009')
                AND A.WO_DATECREATE <= Convert(DateTime,'01/01/2010')
              ) as wo -- WorkOrder + Asset
                Left Outer Join WorkShop.PLTJOBCD as jc
                on jc.JC_WORKORDERNO = wo.WO_WORKORDERNO
            ) as wojc -- WorkOrder + Asset + JobCard
              Left Outer Join Account.Fddst as site
              on wojc.WO_SITECODE = site.DEST_COD
          ) as wojcsite -- WorkOrder + Asset + JobCard + Site
            Left Outer Join WorkShop.PLTJOBCAT as cat
            on wojcsite.JC_CATEGORYCODE = cat.JC_CATEGORYCODE
        ) as wojcsitecat -- WorkOrder + Asset + JobCard + Site + Category
          Left Outer Join WorkShop.PLTJOBTY as ty
          on wojcsitecat.JC_JOBTYPE = ty.JTY_JOBTYPE 
      ) as wojcsitecatty -- WorkOrder + Asset + JobCard + Site + Category + Type
        Left Outer Join WorkShop.PLTFORMN as frmn
        on wojcsitecatty.JC_FOREMANCODE = frmn.JC_FOREMANCODE
    ) as wojcsitecattyfrmn -- WorkOrder + Asset + JobCard + Site + Category + Type + Foreman
      Left Outer Join WorkShop.PLTJOBHR as lh
      on wojcsitecattyfrmn.JC_JOBSEQNO = lh.JC_JOBSEQNO
      AND wojcsitecattyfrmn.WO_WORKORDERNO =  lh.JC_WORKORDERNO
    Distillers Road --> Stronger Than Aquarius

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Ne peux-tu faire cette requête uniquement avec des jointures plutôt qu'avec des sous-requêtes ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Points : 94
    Points
    94
    Par défaut
    Je vais essayer mais, ayant deja essaye, je n'arrivais jamais au bon resultat

    Mais bon merci qd meme
    Distillers Road --> Stronger Than Aquarius

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Ca devrait donner à peu près ça :
    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
    SELECT A.WO_WORKORDERNO, A.WO_SITECODE, A.WO_FROMSITECODE, A.WO_ASSETCODE, B.PL_DESC,
      A.WO_DATECREATE, A.WO_DATESTART, A.WO_DATEEND, A.WO_DATECLOSE, B.PL_BRAND,
      jc.JC_CATEGORYCODE, jc.JC_DATECREATE, jc.JC_FOREMANCODE, jc.JC_JOBDESC,
      jc.JC_JOBTYPE, jc.JC_JOBSEQNO, site.DEST_LIB, cat.JC_CATEGORYDESC, ty.JTY_DESC,
      frmn.JC_FOREMANDESC, lh.HONO, lh.HOURS, lh.RATE
    FROM WorkShop.PLTWKORD AS A WITH (nolock)
    LEFT OUTER JOIN WorkShop.PLTPLANT AS B WITH (nolock)
      ON B.PL_CODE = A.WO_ASSETCODE
    LEFT OUTER JOIN WorkShop.PLTJOBCD AS jc
      ON jc.JC_WORKORDERNO = A.WO_WORKORDERNO
      LEFT OUTER JOIN WorkShop.PLTJOBCAT AS cat
            ON jc.JC_CATEGORYCODE = cat.JC_CATEGORYCODE
      LEFT OUTER JOIN WorkShop.PLTJOBTY AS ty
        ON jc.JC_JOBTYPE = ty.JTY_JOBTYPE 
      LEFT OUTER JOIN WorkShop.PLTFORMN AS frmn
        ON jc.JC_FOREMANCODE = frmn.JC_FOREMANCODE
    LEFT OUTER JOIN WorkShop.PLTJOBHR AS lh
      ON jc.JC_JOBSEQNO = lh.JC_JOBSEQNO
      AND a.WO_WORKORDERNO =  lh.JC_WORKORDERNO
    LEFT OUTER JOIN Account.Fddst AS site
      ON A.WO_SITECODE = site.DEST_COD
    WHERE A.WO_DATECREATE BETWEEN >= '2009-01-01' AND '2010-01-01'
    Remarque 1 : Préférer le BETWEEN plutôt que >= et <=.

    Remarque 2 : Dans la requête, il peut y avoir un problème au niveau de l'avant dernière jointure car la condition porte sur 2 tables. Il faudrait normalement deux instances de la table WorkShop.PLTWKORD AS A, ce qui pourrait donner ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    LEFT OUTER JOIN WorkShop.PLTJOBHR AS lh1
      ON jc.JC_JOBSEQNO = lh.JC_JOBSEQNO
      RIGHT OUTER JOIN WorkShop.PLTWKORD AS A2 WITH (nolock)
        ON a2.WO_WORKORDERNO =  lh.JC_WORKORDERNO
    A essayé éventuellement avec une seconde instance de la table WorkShop.PLTJOBCD AS jc.

    A essayer.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Déjà est-ce que toutes les jointures externes se justifient ?
    Par exemple, si vous avez des clefs étrangères vers des tables de références vous savez que vous n'en avez pas besoin (rapidement, je perçois les sites, les catégories, les job types), et les jointures externes sont plus coûteuses.

    Ensuite, c'est recommandé d'écrire "tout d'un coup". L'optimiseur de toute façon réécrira la requête comme il lui plaît, alors autant simplifier le code :
    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
    SELECT 
        A.WO_WORKORDERNO, A.WO_SITECODE,A.WO_FROMSITECODE, A.WO_ASSETCODE,B.PL_DESC,
        A.WO_DATECREATE, A.WO_DATESTART, A.WO_DATEEND, A.WO_DATECLOSE,B.PL_BRAND,
        jc.JC_CATEGORYCODE, jc.JC_DATECREATE, jc.JC_FOREMANCODE, jc.JC_JOBDESC,
        jc.JC_JOBTYPE, jc.JC_JOBSEQNO, site.DEST_LIB, cat.JC_CATEGORYDESC, ty.JTY_DESC,
        frmn.JC_FOREMANDESC, lh.HONO, lh.HOURS, lh.RATE
    FROM
        WorkShop.PLTWKORD AS A WITH (nolock)
        LEFT OUTER JOIN WorkShop.PLTPLANT AS B WITH (nolock)
          ON B.PL_CODE = A.WO_ASSETCODE
        LEFT OUTER JOIN WorkShop.PLTJOBCD AS jc
          ON jc.JC_WORKORDERNO = A.WO_WORKORDERNO
        LEFT OUTER JOIN Account.Fddst AS site
          ON site.DEST_COD = A.WO_SITECODE
        LEFT OUTER JOIN WorkShop.PLTJOBCAT AS cat
          ON cat.JC_CATEGORYCODE = jc.JC_CATEGORYCODE
        LEFT OUTER JOIN WorkShop.PLTJOBTY AS ty
          ON ty.JTY_JOBTYPE = jc.JC_JOBTYPE
        LEFT OUTER JOIN WorkShop.PLTFORMN AS frmn
          ON frmn.JC_FOREMANCODE = jc.JC_FOREMANCODE
        LEFT OUTER JOIN WorkShop.PLTJOBHR AS lh
          ON lh.JC_JOBSEQNO    = jc.JC_JOBSEQNO
         AND lh.JC_WORKORDERNO = A.WO_WORKORDERNO
    WHERE
        A.WO_DATECREATE >= Convert(DateTime,'01/01/2009')
    AND A.WO_DATECREATE <= Convert(DateTime,'01/01/2010')
    Edit 1 : Grillé

    Edit 2 : Phil, je pense qu'aucune de vos deux remarques soit juste.
    Le moteur SQL doit convertir between en >= et <=.
    Le double prédicat de jointure sur une même table ne pose pas de problème si le besoin le justifie.

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Le moteur SQL doit convertir between en >= et <=.
    Pas sûr ! Si BETWEEN existe, il doit y avoir une raison. Et si j'en crois SQLPro (Point 7 du tableau), BETWEEN serait plus optimisé que >= AND <=.

    Le double prédicat de jointure sur une même table ne pose pas de problème si le besoin le justifie.
    Je n'affirmerais rien à ce sujet mais je suis très méfiant quant au résultat obtenu quand ce genre de cas se présente. Une vérification s'impose.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM A
    JOIN B ON condition_jointure
    Logiquement, la syntaxe de la jointure signifie qu'on joint 1 table à 1 autre. La condition de jointure ne devrait donc porter que sur ces deux tables et pas une troisième.
    Peut-être cette double condition arrive t-elle parce que plusieurs cheminements sont possibles dans le modèle de données pour arriver à la dernière table ?

    Encore une fois, je suis très méfiant et une vérification du résultat s'impose.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    J'ai testé à l'instant sur Oracle (9i / 11g) et SQL Server (2005), aucune différence de plan d'exécution entre BETWEEN et >= / <=.

    Pour les multi jointures, faisons un test (syntaxe SQL Server).
    On a trois tables qu'on rempli :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    declare @table1 table
    (
        id    integer,
        num   integer,
        nom1  varchar(10)
    );
     
    declare @table2 table
    (
        id    integer,
        cod   varchar(10),
        nom2  varchar(10)
    );
     
    declare @table3 table
    (
        cod   varchar(10),
        num   integer,
        nom3  varchar(10)
    );
     
    insert into @table1 values (1, 101, 'ID1');
    insert into @table1 values (2, 102, 'ID2');
    insert into @table1 values (3, 103, 'ID3');
    insert into @table1 values (4, 104, 'ID4');
    insert into @table1 values (5, 105, 'ID5');
     
    insert into @table2 values (1, 'A', 't2-A');
    insert into @table2 values (2, 'B', 't2-B');
    insert into @table2 values (3, 'C', 't2-C');
    insert into @table2 values (4, 'D', 't2-D');
     
    insert into @table3 values ('A', 101, 'TestA');
    insert into @table3 values ('B', 102, 'TestB');
    insert into @table3 values ('D', 104, 'TestD');
    insert into @table3 values ('E', 103, 'TestE');
    On vérifie les données :
    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 * from @table1;
     
    id          num         nom1
    ----------- ----------- ----------
    1           101         ID1
    2           102         ID2
    3           103         ID3
    4           104         ID4
    5           105         ID5
     
    select * from @table2;
     
    id          cod        nom2
    ----------- ---------- ----------
    1           A          t2-A
    2           B          t2-B
    3           C          t2-C
    4           D          t2-D
     
    select * from @table3;
     
    cod        num         nom3
    ---------- ----------- ----------
    A          101         TestA
    B          102         TestB
    D          104         TestD
    E          103         TestE
    Et faisons le test qui nous intéresse :
    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
    select
        t1.nom1,
        t2.nom2,
        t3.nom3
    from
        @table1 t1
        inner join @table2 t2
          on t2.id = t1.id
        left outer join @table3 t3
          on t3.cod = t2.cod
         and t3.num = t1.num;
     
    nom1       nom2       nom3
    ---------- ---------- ----------
    ID1        t2-A       TestA
    ID2        t2-B       TestB
    ID3        t2-C       
    ID4        t2-D       TestD
    Rien d'incohérent et j'ai bien le résultat que j'attendais !

  8. #8
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Points : 94
    Points
    94
    Par défaut
    Bonjour et merci encore de vous pencher sur le probleme.

    J'ai en effet enlever les requetes imbriques et j'ai modifie le between. Par contre pour la jointure avec 2 conditions c'est necessaire car ce sont les 2 cles primaires de la table.
    Je sui sentrain de regarder au niveau des index dans sql server 2005 et voila je ne sais comment faire pour faire mieux.

    Pour les joitures externes effectivment, il ne me faut pas garder les cles etrangere mais juste m'en servir pour acceder certaines donnees.

    Il y a t il d'autre moyen pour faire cela?

    Merci
    Distillers Road --> Stronger Than Aquarius

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par garciajulien Voir le message
    Pour les jointures externes effectivment, il ne me faut pas garder les cles etrangere mais juste m'en servir pour acceder certaines donnees.
    Là j'ai du mal à vous suivre !

    Le principe de la jointure externe c'est de ramener les résultats si une partie de la jointure n'existe pas.

    Je suis quasi sûr que votre table WorkShop.PLTJOBCAT qui contient les libellés des catégories possède une clef primaire sur JC_CATEGORYCODE, et j'espère que votre table WorkShop.PLTJOBCD a une clef étrangère indexée sur sa colonne JC_CATEGORYCODE.

    Si c'est le cas, la jointure externe est complètement inutile et vous pouvez convertir votre LEFT OUTER JOIN en INNER JOIN.

    Si vous éliminez la majorité des jointures externes vous gagnerez en performance.

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par garciajulien Voir le message
    Par contre pour la jointure avec 2 conditions c'est necessaire car ce sont les 2 cles primaires de la table.
    Une table ne peut avoir qu'une seule clef primaire. Jamais deux !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  11. #11
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Si tu pouvais fournir un schéma (MCD, MLD, E/R, diagramme de classes...) de ta BDD, on pourrait peut-être trouver une autre manière de t'aider à joindre tout ça correctement.

    Une description du besoin ne serait pas de trop non plus. Tu as vraiment besoin de ramener toutes ces colonnes ?

    Pour les joitures externes effectivment, il ne me faut pas garder les cles etrangere mais juste m'en servir pour acceder certaines donnees.

    Il y a t il d'autre moyen pour faire cela?
    Euh... là j'ai pas trop compris !
    Le principe de base est que les tables sont associées par une condition de jointure entre clé primaire et clé étrangère.

    Par contre pour la jointure avec 2 conditions c'est necessaire car ce sont les 2 cles primaires de la table.
    Ca veut dire que la table en question est une table issue d'une association à cardinalités n,m ?

    Quand j'ai à faire des requêtes complexes, je pars du schéma de la BDD pour construire le cheminement des jointures. Essaie de faire pareil.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  12. #12
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Points : 94
    Points
    94
    Par défaut
    Je viens d'en referer a mon DBA, on va refaire la db car on est en plein rewrite donc ce sera mieux de repartir sur de bonne base.

    Je creuse la dessus et je veins vous retrouver quand tout sera propre si j'ai encore des soucis. Encore merci ^^
    Distillers Road --> Stronger Than Aquarius

Discussions similaires

  1. [C#] Paramètre par défaut dans une fonction
    Par RobinJulie dans le forum Windows Forms
    Réponses: 5
    Dernier message: 18/01/2012, 14h07
  2. Réponses: 5
    Dernier message: 26/08/2009, 09h53
  3. [PLSQL 9i] Paramètre par défaut d'une fonction
    Par lbgl dans le forum Oracle
    Réponses: 8
    Dernier message: 20/02/2007, 16h36
  4. [Mail] Reception et traitement d'un mail par PHP
    Par anisb dans le forum Langage
    Réponses: 4
    Dernier message: 20/10/2006, 20h24
  5. Traitement des champs memo par DBGrid
    Par Sydaze dans le forum Bases de données
    Réponses: 4
    Dernier message: 18/04/2005, 09h24

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