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

Langage SQL Discussion :

Problème de jointure et de count


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Inscrit en
    Juin 2009
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 346
    Points : 163
    Points
    163
    Par défaut Problème de jointure et de count
    Voici mon problème, je suis malgré moi obligé d'apprendre le SQL dans le cadre d'un stage où je dois réaliser des statistiques.
    Le client utilisé est : Hyperfile (je ne connais pas ensuite le langage SQL spécifique (ci c'est du MySQL...) car je débute.

    J'ai un problème de jointure de type :

    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 CABINET
    ,COMPTAGE1
    ,COMPTAGE2 
     
    FROM
     
    (SELECT CABINET
    , COUNT (*) AS COMPTAGE1
    FROM DOSSIERS.FIC
    WHERE "des trucs"
    GROUP BY CABINET) T1
     
    FULL OUTER JOIN
     
    (SELECT CABINET
    , COUNT (*) AS COMPTAGE2
    FROM 
          (SELECT DISTINCT ID_DOSSIER
           ,...
           ,... 
           FROM (DOSSIERS.FIC OUTER JOIN DANGEROSITE_DOSSIER.FIC 
                                        ON DOSSIERS.FIC.ID_DOSSIER = DANGEROSITE_DOSSIER.FIC.ID_DOSSIER 
                    WHERE "des trucs")
          GROUP BY CABINET) T2
     
    ON T1.CABINET=T2.CABINET;
    (Désolé pour la mise en forme je n'ai pas réussi à l'afficher comme il est demandé dans la charte :/)

    En tous cas cela ne fonctionne pas (je ne peux pas faire de CREATE VIEW premier AS matable1... car la fonction CREATE VIEW n'est pas gérée).
    Si je remplace la table notée T1 par DOSSIERS.FIC par exemple (et que je modifie le ON final) il n'y a pas de message d'erreur, mais dès que je mets un SELECT, au final, il dit : T1.FIC introuvable. C'est comme s'il oubliait le début !

    Celà est-il dû aux 2 count ? (cela a déjà fonctionné avec des requêtes plus simples) ou est-ce du à un problème de 2 JOIN ? Cela fait 11h que je bute sur ce problème qui consite au final à joindre 2 tables de 2 colonnes dont une commune...

    Je précise que chaque table prise à partie fonctionne parfaitement. C'est au moment de la jointure qu'il ne se passe rien.

    J'ai essayé de regarder dans les autres posts mais aucun ne m'a sorti du pétrin ! :p

    Merci en tous cas à ceux qui auront lu mon message.

    Eric.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Que veut dire "cela ne fonctionne pas"?

    Il me semble que tu as une parenthèse gauche en trop dans ta seconde requête, juste avant "DOSSIERS.FIC OUTER JOIN".

    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 coalesce(T1.CABINET, T2.CABINET),T1.COMPTAGE1,T2.COMPTAGE2 
    FROM
        (
         SELECT 
                CABINET, 
                COUNT (*) AS COMPTAGE1
         FROM DOSSIERS.FIC
         WHERE "des trucs"
         GROUP BY CABINET
        ) T1
    FULL OUTER JOIN
        (
         SELECT 
                CABINET, 
                COUNT (*) AS COMPTAGE2
         FROM 
              (
               SELECT DISTINCT 
                      ID_DOSSIER,...,... 
               FROM DOSSIERS.FIC 
               OUTER JOIN DANGEROSITE_DOSSIER.FIC 
                     ON DOSSIERS.FIC.ID_DOSSIER = DANGEROSITE_DOSSIER.FIC.ID_DOSSIER 
               WHERE "des trucs"
               )
         GROUP BY CABINET
        ) T2
    ON T1.CABINET=T2.CABINET;

  3. #3
    Membre habitué
    Inscrit en
    Juin 2009
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 346
    Points : 163
    Points
    163
    Par défaut
    Bonjour,

    Cela ne fonctionne pas signifie qu'il ne se passe rien. Aucun message d'erreur mais rien n'apparaît (pourtant il réfléchit 10 secondes)

    J'ai bien retapé ma requête exacte avec votre code et toujours rien.

    Comme j'ai dit plus haut, chacune des 2 tables prise à partie fonctionne parfaitement. C'est le JOIN qui ne fonctionne pas.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Hyperfile est un moteur extrêmement limité qui ne permet que peu de choses au regard de ce que permet le langage SQL. En particulier je ne crois pas qu'il supporte ni les sous requêtes en tables dérivées (sous requêtes dans la clause FROM), ni les CTE.

    Comme il ne supporte pas non plus les vues. Vous êtes dans une impasse technique.
    Mieux vaut donc changer de SGBDR, sauf à bricoler une solution mi ensembliste mi itérative avec le risque majeur d'avoir des résultats incohérent.

    A +

  5. #5
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    A ce que j'ai lu, Hyperfile est un SGBD.
    Mais t'as vraiment pas de bol de devoir débuter le SQL sur cette (censure)...

    Enfin bref, on peut déjà tester si c'est parce qu'il a du mal avec le FULL :
    Essaie en remplacant par JOIN puis LEFT OUTER.

    [EDIT] grillé !
    Je pense aussi qu'il faut jetter ce truc à la poubelle... mais je suppose qu'on ne peut pas décider ce genre de chose en tant que stagiaire. Courage !

  6. #6
    Membre habitué
    Inscrit en
    Juin 2009
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 346
    Points : 163
    Points
    163
    Par défaut
    Effectivement si vous êtes dans le vrai, c'est un problème. Cela dit, la requête suivante fonctionne elle :

    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 T1.CABINET,COMPTAGE1,COMPTAGE2
    FROM
        (
        SELECT CABINET, COUNT(*) AS COMPTAGE1
        FROM DOSSIERS.FIC
        WHERE "des trucs"
        GROUP BY CABINET
        ) T1
    OUTER JOIN
        (
        SELECT CABINET, COUNT(*) AS COMPTAGE2
        FROM DOSSIERS.FIC
        WHERE "des trucs"
        GROUP BY CABINET
        ) T2
    ON T1.CABINET = T2.CABINET;
    Quelle est donc la différence avec celle que je voudrais réaliser ? Il y a une jointure de + c'est vrai... et un SELECT aussi....

    Mais c'est quand même affolant si hyperfile ne sait pas joindre 2 colonnes :s

    Eric.

  7. #7
    Membre habitué
    Inscrit en
    Juin 2009
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 346
    Points : 163
    Points
    163
    Par défaut
    Re,
    j'ai bien essayé avec LEFT RIGHT FULL CROSS INNER OUTER FASTER BETTER STRONGER... mais rien n'y fait !
    Même au lieu de faire un JOIN j'ai tenté de mettre des virgules et mettre WHERE au lieu du ON final mais rien n'y fait..

    Et oui en temps que stagiaire je me vois mal aller tapoter sur l'épaule de l'informaticien pour lui dire que ca fait 2 semaines que je fais du SQL et que je trouve que ce qu'il a fait n'est vraiment pas top du tout !

    Mais je me vois encore moins expliquer à mon maître de stage que je n'arrive pas à mettre 2 colonnes l'une à côté de l'autre !

    Eric.

  8. #8
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Un truc bizarre dans la requête de ton message #6 dont tu dis pourtant qu'elle fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ...
    FROM ...
    OUTER JOIN ...
    Cette syntaxe n'est pas bonne car il manque LEFT ou RIGHT ou FULL !

    Dans ta première requête, celle qui ne fonctionne pas, tu as le même problème de syntaxe avec la jointure supplémentaire.

    Dans les jointures externes, le mot facultatif, c'est OUTER, pas les autres.

    De plus, dans T2, tu GROUP BY CABINET mais il ne figure pas dans le SELECT de la sous-requête. Pour finir, il manque l'alias de la sous requête à l'intérieur de T2.

    J'ai remis ci-dessous ta première requête en forme en supposant que le dernier OUTER JOIN est un LEFT OUTER JOIN et en utilisant des alias de 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
    21
    22
    SELECT T1.CABINET, T1.COMPTAGE1, T2.COMPTAGE2 
    FROM (
      SELECT CABINET,COUNT(*) AS COMPTAGE1
      FROM DOSSIERS.FIC
      WHERE "des trucs"
      GROUP BY CABINET
    ) T1
     
    FULL OUTER JOIN
     
    (
      SELECT T3.CABINET, COUNT(*) AS COMPTAGE2
      FROM (
        SELECT DISTINCT f1.ID_DOSSIER, f1.CABINET, f2.yyy 
        FROM DOSSIERS.FIC AS f1
        LEFT OUTER JOIN DANGEROSITE_DOSSIER.FIC AS f2 ON f1.ID_DOSSIER = f2.ID_DOSSIER 
        WHERE "des trucs"
      ) T3
      GROUP BY T3.CABINET
    ) T2
     
    ON T1.CABINET=T2.CABINET;

  9. #9
    Membre habitué
    Inscrit en
    Juin 2009
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 346
    Points : 163
    Points
    163
    Par défaut
    C'est gentil de m'aider merci.
    J'ai donc tapé ce que je voulais avec ta structure :

    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 T1.NUMERO_SIRET_CABINET, T1.NBDOSSIERS, T2.NBVGE
    FROM (
      SELECT NUMERO_SIRET_CABINET,COUNT(*) AS NBDOSSIERS
      FROM DOSSIERS.FIC
      WHERE "des trucs"
      GROUP BY NUMERO_SIRET_CABINET
    ) T1
     
    FULL OUTER JOIN
     
    (
      SELECT T3.NUMERO_SIRET_CABINET, COUNT(*) AS NBVGE
      FROM (
        SELECT DISTINCT f1.ID_DOSSIER, f1.NUMERO_SIRET_CABINET
        FROM DOSSIERS.FIC AS f1
        LEFT OUTER JOIN DANGEROSITE_DOSSIER.FIC AS f2 ON f1.ID_DOSSIER = f2.ID_DOSSIER 
        WHERE "des trucs"
      ) T3
      GROUP BY T3.NUMERO_SIRET_CABINET
    ) T2
     
    ON T1.NUMERO_SIRET_CABINET=T2.NUMERO_SIRET_CABINET;
    en ne mettant pas ton f2.yyy car je ne comprends pas tellement de quoi il s'agit. Tout cela pour dire qu'indépendamment les tables T1 et T2 fonctionnent très bien (à chaque fois : 2 colonnes : NUMERO_SIRET_CABINET et Une valeur associée) mais la jointure ne fonctionne toujours pas. Il n'y a pas de message d'erreur mais il ne se passe rien. Ce qui est un problème.

    Sans tomber dans le "au secours sortez-moi de là ou je vais mourir", ceci me pose un grave problème pour la suite de mon stage car je suis bloqué pour la suite.

    Si quelqu'un a une idée...

    Eric.

  10. #10
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Si tu exécutes la partie de requête ci-dessous seule, qu'estc-e que ça donne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT f1.ID_DOSSIER, f1.NUMERO_SIRET_CABINET
        FROM DOSSIERS.FIC AS f1
        LEFT OUTER JOIN DANGEROSITE_DOSSIER.FIC AS f2 ON f1.ID_DOSSIER = f2.ID_DOSSIER 
        WHERE "des trucs"
    Bien entendu, dans toute cette discussion, on suppose que "des trucs" est remplacé par quelque chose de correct !

  11. #11
    Membre habitué
    Inscrit en
    Juin 2009
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 346
    Points : 163
    Points
    163
    Par défaut
    Re, (encore désolé de pas savoir afficher les codes SQL au format demandé par la charte)

    Lorsque je tape :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT f1.ID_DOSSIER, f1.NUMERO_SIRET_CABINET
        FROM DOSSIERS.FIC AS f1
        LEFT OUTER JOIN DANGEROSITE_DOSSIER.FIC AS f2 ON f1.ID_DOSSIER = f2.ID_DOSSIER 
        WHERE ((CODE_DANGEROSITE='CA3' OR CODE_DANGEROSITE='LS3' OR CODE_DANGEROSITE='DI3' OR CODE_DANGEROSITE='SP4') AND DEFICIENCE_IMPUTABLE='1')
    AND (CODE_GENRE='TAGE03' OR CODE_GENRE='TAGE16' OR CODE_GENRE='TAGE30')
    AND (CODE_NATURE_EVENEMENT='TANE11' OR CODE_NATURE_EVENEMENT='TANE12')
    AND ((DATE_RAPPORT_1A='20090611' AND DANGEROSITE_1A='1') OR (DATE_RAPPORT_1A='' AND DATE_RAPPORT_1B='20090611' AND DANGEROSITE_1B='1'))
    AND REPARABILITE_ECONOMIQUE='1'
    (je t'ai copié le WHERE pour que tu voies qu'il est correct )

    Il m'affiche 2 colonnes, une avec des ID_DOSSIER et en face le NUMERO_SIRET_CABINET qui a envoyé ce dossier. D'où ensuite mon COUNT pour savoir combien de dossiers par cabinet.

    Chaque table fonctionne, c'est la jointure qui me pose un soucis... pourtant j'en ai déjà fait mais ce cas particulier bloque :/

    Si tu as une idée, je t'en suis reconnaissant.

    Eric.

  12. #12
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par EriCstoFF Voir le message
    Re, (encore désolé de pas savoir afficher les codes SQL au format demandé par la charte)
    Errare humanum est, perseverare diabolicum !
    Utilise le bouton # au dessus de la zone où tu tapes ou édites ton message.

    Remarques sur ton WHERE :
    1) préfère le IN à la succession de OR sur une même colonne
    2) les colonnes DATE_RAPPORT_1A et DATE_RAPPORT_1B sont-elles vraiment de type VARCHAR ? Elles devraient être de type DATE. Peut-être aussi que l'absence de date n'est pas une chaîne vide mais un NULL ?

    Comme ton where est compliqué, exécute successivement la requête en ajoutant petit à petit les conditions. Tu verras ainsi à quel moment la requête ne donne plus de résultat.

    J'ai réécris ci-dessous la requête en tenant des remarques ci-dessus. A toi de voir si ça convient.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT DISTINCT f1.ID_DOSSIER, f1.NUMERO_SIRET_CABINET
    FROM DOSSIERS.FIC AS f1
    LEFT OUTER JOIN DANGEROSITE_DOSSIER.FIC AS f2 ON f1.ID_DOSSIER = f2.ID_DOSSIER 
    WHERE CODE_DANGEROSITE IN('CA3', 'LS3', 'DI3', 'SP4')
      AND CODE_GENRE IN('TAGE03', 'TAGE16', 'TAGE30')
      AND CODE_NATURE_EVENEMENT IN('TANE11', 'TANE12')
      AND (
        (DATE_RAPPORT_1A = '2009/06/11' AND DANGEROSITE_1A = '1')
        OR (DATE_RAPPORT_1A IS NULL AND DATE_RAPPORT_1B = '2009/06/11' AND DANGEROSITE_1B = '1')
      )
      AND REPARABILITE_ECONOMIQUE = '1'
    Edit
    Dernier détail : quand tu utilises des alias, essaie ensuite de les utiliser partout dans la requête. Ca évite les ambiguîtés éventuelles de colonnes et ça aide à la compréhension de la requête.

  13. #13
    Membre habitué
    Inscrit en
    Juin 2009
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 346
    Points : 163
    Points
    163
    Par défaut
    Merci de m'aider en tous cas. Ok pour les IN, je ne connaissais pas (je suis le Jimi Hendrix du SQL je fais pas de cours ^^)
    Pour les dates c'est sûr que c'est bon comme je les mets et l'absence de date se traduit bien par DATE=''.
    Voici donc le code que je tape (je précise que les tables T1 et T2 fonctionnent parfaitement quand on les exécute une par une, c'est au moment de la jointure que rien ne s'affiche, ce qui a le don de me faire enrager depuis 2 jours que je suis dessus)

    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
    SELECT T1.NUMERO_SIRET_CABINET, T1.NBDOSSIERS, T2.NBVGE
    FROM (
      SELECT NUMERO_SIRET_CABINET,COUNT(*) AS NBDOSSIERS
      FROM DOSSIERS.FIC
      WHERE ((DATE_RAPPORT_1A='20090610') OR (DATE_RAPPORT_1A='' AND DATE_RAPPORT_1B='20090610'))
      GROUP BY NUMERO_SIRET_CABINET
    ) T1
     
    FULL OUTER JOIN
     
    (
      SELECT T3.NUMERO_SIRET_CABINET, COUNT(*) AS NBVGE
      FROM (
       SELECT DISTINCT f1.ID_DOSSIER, f1.NUMERO_SIRET_CABINET
       FROM DOSSIERS.FIC AS f1
       LEFT OUTER JOIN DANGEROSITE_DOSSIER.FIC AS f2 ON f1.ID_DOSSIER = f2.ID_DOSSIER 
       WHERE CODE_DANGEROSITE IN('CA3', 'LS3', 'DI3', 'SP4')
       AND CODE_GENRE IN('TAGE03', 'TAGE16', 'TAGE30')
       AND CODE_NATURE_EVENEMENT IN('TANE11', 'TANE12')
       AND (
        (DATE_RAPPORT_1A = '20090611' AND DANGEROSITE_1A = '1')
        OR (DATE_RAPPORT_1A='' AND DATE_RAPPORT_1B = '20090611' AND DANGEROSITE_1B = '1')
      )
      AND REPARABILITE_ECONOMIQUE = '1'
      ) T3
      GROUP BY T3.NUMERO_SIRET_CABINET
    ) T2
     
    ON T1.NUMERO_SIRET_CABINET=T2.NUMERO_SIRET_CABINET;
    Si tu as un plan magique... en plus c'est mal foutu je ne peux pas faire de CREATE VIEW... donc si tu es à 2 doigts de me dire : Ben je vois pas. Dis moi plutôt s'il n'y a pas une alternative, ca m'évitera de tout casser

  14. #14
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Applique ce conseil que tu n'as peut-être pas vu dans mon précédent message :
    Comme ton where est compliqué, exécute successivement la requête en ajoutant petit à petit les conditions. Tu verras ainsi à quel moment la requête ne donne plus de résultat.
    Je parle bien sûr de la sous-requête de la dernière jointure.

  15. #15
    Membre habitué
    Inscrit en
    Juin 2009
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 346
    Points : 163
    Points
    163
    Par défaut
    Petite variante qui peut vous être utile. Lorsque je tape le code précédent sans les WHERE (c'est à dire :

    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 T1.NUMERO_SIRET_CABINET, T1.NBDOSSIERS, T2.NBVGE
    FROM (
      SELECT NUMERO_SIRET_CABINET,COUNT(*) AS NBDOSSIERS
      FROM DOSSIERS.FIC
      GROUP BY NUMERO_SIRET_CABINET
    ) T1
     
    FULL OUTER JOIN
     
    (
      SELECT T3.NUMERO_SIRET_CABINET, COUNT(*) AS NBVGE
      FROM (
       SELECT DISTINCT f1.ID_DOSSIER, f1.NUMERO_SIRET_CABINET
       FROM DOSSIERS.FIC AS f1
       FULL OUTER JOIN DANGEROSITE_DOSSIER.FIC AS f2 ON f1.ID_DOSSIER = f2.ID_DOSSIER 
     
      ) T3
      GROUP BY T3.NUMERO_SIRET_CABINET
    ) T2
     
    ON T1.NUMERO_SIRET_CABINET=T2.NUMERO_SIRET_CABINET;
    )

    Il y a un message d'erreur :
    Impossible d'ouvrir T1.FIC

    Le fichier est introuvable



    Est-ce un problème de : j'ai pas le droit de créer des "trucs" temporaires ?

    Eric.

  16. #16
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Un truc qui m'avait étonné au début et que je revois maintenant avec cette précision :
    FROM DOSSIERS.FIC
    et
    JOIN DANGEROSITE_DOSSIER.FIC
    signifient que tu prends les tables FIC des bases DOSSIERS et DANGEROSITE_DOSSIER. Ce ne serait pas le contraire par hasard ?
    Parce que le message d'erreur dit qu'il ne trouve pas la table FIC dans la base T1, ce qui est pour le moins surprenant. Ou alors ton SGBD a une syntaxe inversée sur ce plan !

  17. #17
    Membre habitué
    Inscrit en
    Juin 2009
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 346
    Points : 163
    Points
    163
    Par défaut
    Re, désolé mais je ne comprends pas bien ta question (je suis débutant :p) mais si ca peut t'aider mon SGBD c'est HyperFile. Il parait que ce n'est pas terrible mais je n'y peux pas grand chose. Disons que dans HyperFile, dans la colonne de gauche il y a les répertoires : DOSSIERS.FIC, CODE_DANGEROSITE.FIC, FAMILLES_PIECES.FIC... et il y a un onglet SQL dans lequel je fais mes recherches.

    Mon message d'erreur ne pourrait-il pas signifier que je ne peux créer des T1.FIC temporaires par exemple ? Si oui y a t-il une alternative ? ... sachant que les CREATE VIEW ne fonctionnent pas (fonction non gérée)...

    Je suis dans l'impasse et il faut impérativement que je réussisse :/

    Eric.

  18. #18
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Ne connaissant pas Hyperfile, je ne vais plus t'être d'un très grand secours je le crains.
    Il semble qu'hyperfile inverse l'ordre habituel du nom complet des tables.
    Normalement c'est :
    Apparemment chez toi le nom de la base est FIC et ce qu'il y a avant FIC dans la requête est le nom de la table. Très bizarre comme façon de faire !

    Ton idée de ne pouvoir créer de table temporaire T1.FIC est peut-être une piste à creuser.
    Cherche de la doc sur Hyperfile ou cherche sur Google avec des critères du genre :
    Hyperfile sous-requête
    Hyperfile requête dans le FROM
    ...

    Bon courage

  19. #19
    Membre habitué
    Inscrit en
    Juin 2009
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 346
    Points : 163
    Points
    163
    Par défaut
    Je me sens tellement dégoûté... plus de 20h que je cherche à créer un tableau de 3 colonnes... cette sensation de stagner me fait enrager au plus haut point...
    Il va impérativement falloir que je trouve une solution car sans cela je suis bloqué...

  20. #20
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Avez vous essayé avec une union?
    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
    SELECT NUMERO_SIRET_CABINET, sum(NBDOSSIERS), sum(NBVGE)
    FROM 
    (
        SELECT NUMERO_SIRET_CABINET,COUNT(*) AS NBDOSSIERS, NULL AS NBVGE
        FROM DOSSIERS.FIC
        WHERE "des trucs"
        GROUP BY NUMERO_SIRET_CABINET
    ) 
    UNION ALL
    (
        SELECT f1.NUMERO_SIRET_CABINET, NULL AS NBDOSSIERS, count(DISTINCT f1.ID_DOSSIER) as NBVGE 
        FROM DOSSIERS.FIC AS f1
        LEFT OUTER JOIN DANGEROSITE_DOSSIER.FIC AS f2 ON f1.ID_DOSSIER = f2.ID_DOSSIER 
        WHERE "des trucs"
        GROUP BY f1.NUMERO_SIRET_CABINET
    ) 
    GROUP BY NUMERO_SIRET_CABINET;

Discussions similaires

  1. Problème de jointure de tables
    Par AurelBUD dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/04/2005, 17h27
  2. Probléme de jointure
    Par Ajrarn dans le forum Langage SQL
    Réponses: 14
    Dernier message: 24/02/2005, 15h57
  3. Vraisemblable problème de jointure
    Par pimousse76 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/02/2005, 16h34
  4. [MS Access] Problème de jointure
    Par Erakis dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/02/2005, 22h15
  5. Problème de jointure ?!
    Par ebaynaud dans le forum Langage SQL
    Réponses: 8
    Dernier message: 03/11/2004, 12h27

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