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 :

Erreur sur syntaxe de jointure


Sujet :

Langage SQL

  1. #1
    Membre habitué Avatar de rsuinux
    Homme Profil pro
    Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Inscrit en
    Août 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Secteur : Santé

    Informations forums :
    Inscription : Août 2007
    Messages : 128
    Points : 170
    Points
    170
    Par défaut Erreur sur syntaxe de jointure
    Bonjour,
    Je tente de transformer des requêtes imbriquées en requête avec jointure, mais à l'exécution, j'ai une erreur "parenthèse de droite absente". comme ce sont mes premières je pense que je m'y prend mal (très mal).
    Si quelqu'un à une suggestion.
    Voila la première qui fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select v.valeur "Motif appel",
           p.nompat "Nom",
           p.prepat "Prénom" 
    from valmesu v , patient p
    where v.nomesure= (select m.nomesure from mesure m where m.mesure  ='0123456987' and nvl(m.etat,' ') != 'X')
    and ( nvl(v.etat, ' ') != 'X' )
    and p.nodos = 'xxxxxxxxxx'
    Et ma modeste tentative de transformation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    select v.valeur "Motif d'appel",
           p.nompat "Nom",
           p.prepat "Prenom"
    from   valmesu v,
           patient p,
           mesure m 
           join mesure mm on mm.nomesure = v.nomesure
    where  EXTRACT ( mesure from mm.mesure ) = '0123456987'
    --       and  and nvl(m.etat,' ') != 'X'
           and ( nvl(v.etat, ' ') != 'X' )
         and p.nodos = 'xxxxxxxxxx'

    Merci de votre aide.
    Rémi.
    Si tu ne sais pas: demande, si tu sais, partage.

  2. #2
    Membre habitué Avatar de rsuinux
    Homme Profil pro
    Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Inscrit en
    Août 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Secteur : Santé

    Informations forums :
    Inscription : Août 2007
    Messages : 128
    Points : 170
    Points
    170
    Par défaut
    J me réponds à moi même.
    J'ai continué à chercher, et suis arrivé à cette syntaxe qui fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select v.valeur "Motif appel",
           p.nompat "Nom",
           p.prepat "Prénom" 
    from   patient p,
           valmesu v join mesure m
             on v.nomesure = m.nomesure
    where  m.mesure  ='0123456987' 
           and nvl(m.etat,' ') != 'X'
           and ( nvl(v.etat, ' ') != 'X' )
           and p.nodos = 'xxxxxxxxxx'
    Est-ce que cela peut être optimisé?
    Merci.
    Si tu ne sais pas: demande, si tu sais, partage.

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bizarre que tu n'aies pas de jointure entre patients et les autres tables.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select v.valeur "Motif appel",
           p.nompat "Nom",
           p.prepat "Prénom" 
    from patient p
    join valmesu v on (p.nodos = 'xxxxxxxxxx')
    join  mesure m on v.nomesure = m.nomesure
    where m.mesure  ='0123456987'
     and nvl(m.etat,' ') != 'X'
     and nvl(v.etat, ' ') != 'X' ;

  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 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 561
    Points
    52 561
    Billets dans le blog
    5
    Par défaut
    Quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select v.valeur AS "Motif appel",
           p.nompat AS "Nom",
           p.prepat AS "Prénom" 
    from   valmesu AS v 
           CROSS JOIN patient AS p
    where  v.nomesure = (select m.nomesure from mesure m where m.mesure  ='0123456987' and COALESCE(m.etat,' ') <> 'X')
    and ( COALESCE(v.etat, ' ') <> 'X' )
    and p.nodos = 'xxxxxxxxxx'
    ???

    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/ * * * * *

  5. #5
    Membre habitué Avatar de rsuinux
    Homme Profil pro
    Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Inscrit en
    Août 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Secteur : Santé

    Informations forums :
    Inscription : Août 2007
    Messages : 128
    Points : 170
    Points
    170
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Bizarre que tu n'aies pas de jointure entre patients et les autres tables.
    En fait, cela n'est qu'un test sur un seul patient.
    La requête finale se fait bien sûr à partir des patients . Là je ne filtre que sur le n° de dossier pour un patient test
    Si tu ne sais pas: demande, si tu sais, partage.

  6. #6
    Membre habitué Avatar de rsuinux
    Homme Profil pro
    Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Inscrit en
    Août 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Secteur : Santé

    Informations forums :
    Inscription : Août 2007
    Messages : 128
    Points : 170
    Points
    170
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select v.valeur AS "Motif appel",
           p.nompat AS "Nom",
           p.prepat AS "Prénom" 
    from   valmesu AS v 
           CROSS JOIN patient AS p
    where  v.nomesure = (select m.nomesure from mesure m where m.mesure  ='0123456987' and COALESCE(m.etat,' ') <> 'X')
    and ( COALESCE(v.etat, ' ') <> 'X' )
    and p.nodos = 'xxxxxxxxxx'
    ???

    A +
    Est ce que la jointure ET le select dans le where ne font pas perdre en performance?
    Si tu ne sais pas: demande, si tu sais, partage.

  7. #7
    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 561
    Points
    52 561
    Billets dans le blog
    5
    Par défaut
    NON !

    Une requête n'est pas un code exécutable... C'est juste une demande de résultat. L'optimiseur décidera du programme d'exécution tout seul en fonction des différents possibilités !

    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/ * * * * *

  8. #8
    Membre habitué Avatar de rsuinux
    Homme Profil pro
    Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Inscrit en
    Août 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Secteur : Santé

    Informations forums :
    Inscription : Août 2007
    Messages : 128
    Points : 170
    Points
    170
    Par défaut
    @SQLpro : merci de ta réponse.

    Si tu ne sais pas: demande, si tu sais, partage.

  9. #9
    Membre habitué Avatar de rsuinux
    Homme Profil pro
    Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Inscrit en
    Août 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Secteur : Santé

    Informations forums :
    Inscription : Août 2007
    Messages : 128
    Points : 170
    Points
    170
    Par défaut
    Pour tout vous dire, je ne m'en sors pas.
    Voila ma problématique de base et pourquoi je cherchais à faire d'abord un test:
    j'ai des données à extraire. Base oracle. La requête fonctionne à 99% . Sauf pour un élément, qui dépend d'une autre table, non comprise dans la requête initiale.
    Ma requête du début du fil de discussion est un test pour trouver mes données (les tables sont assez imbriquées les unes les autres...)
    Bref, là j'ai bien mes données:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select v.valeur "Motif appel",
           v.nomesure " v . nomesure",
           m.mesure " m . mesure",
           p.nompat "Nom",
           p.prepat "Prénom"
    from   patient p,
           valmesu v join mesure m
             on v.nomesure = m.nomesure
    where  m.mesure  ='9900036802'
           and nvl(m.etat,' ') != 'X'
           and ( nvl(v.etat, ' ') != 'X' )
           and p.nodos = '901007996'
    résultat attendu et résultat trouvé pour le test: 3 lignes avec 3 valeurs différentes, mais pour une mesure (accessoirement un patient).
    Quand je tente d'inclure dans ma recherche initiale... c'est la cata.
    Voila comment ce présente la requête initiale: on recherche sur un "formulaire n° 12345", uniquement le contenu de certaine mesure
    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
     
    select  Trim(p.njfpat) ||' ' || Trim(p.nompat) ||'   ' ||trim(p.prepat) Nom_Prenom,
              DECODE(SEXE, 'M', 'M. ', 'F', 'Mme ', 'I', ' ')  GENRE, -- Genre du patient,
              Trim(TO_char(to_date(p.dtnais,'YYYYMMDD'),'DD/MM/YYYY')) Naissance,
    -- Date et heure d'examen
              f_mesure_datexam.resultat  "Date d'examen",
              f_mesure_heurexam.resultat "Heure d'examen",
    -- Motif de l'appel
              f_mesure_motifappel.resultat "Motif de l'appel",
              f_mesure_motifprecision.resultat "Précision motif de l'appel"
     
     
    from document formulaire, patient p, t_evt_rdv er, t_rdv r, valmesu v,
     
     
     
     
    -- Recherche sur les mesures  --   
    -- Date et heure d'examen 
              (select * from mesure m where m.mesure  ='xxxxxxxxx1' and nvl(m.etat,' ') != 'X'   ) f_mesure_datexam,
              (select * from mesure m where m.mesure  ='xxxxxxxxx2' and nvl(m.etat,' ') != 'X'   ) f_mesure_heurexam,
    -- Motif de l'appel
              (select * from mesure m where m.mesure  ='xxxxxxxxx3' and nvl(m.etat,' ') != 'X'  ) f_mesure_motifappel,  --<< celle la ne fonctionne pas
              (select * from mesure m where m.mesure  ='xxxxxxxxx4' and nvl(m.etat,' ') != 'X'  ) f_mesure_motifprecision
     
     
     
     
    -- Recherche dans le formulaire 
    where formulaire.nodoctype in ('12345')        -- <- n° du formulaire 
              and formulaire.noevt = er.noevt
              and nvl(formulaire.etat,' ') != 'X'
              and formulaire.typeevt = 'R'
              and er.nordv = r.nordv
              and r.date_debut > to_date('10/03/2023','DD/MM/YYYY')  
              and er.nopat = p.nopat
    -- Date et heure d'examen 
              and f_mesure_datexam.nodocument(+) = formulaire.nodocument
              and f_mesure_heurexam.nodocument(+) = formulaire.nodocument
    -- Motif de l'appel
              and f_mesure_motifappel.nomesure = v.nomesure
              and ( nvl(v.etat, ' ') != 'X' )
              and f_mesure_motifappel.nodocument(+) = formulaire.nodocument
              and f_mesure_motifprecision.nodocument(+) = formulaire.nodocument
    Le résultat attendu pour test:
    3 lignes avec 3 valeurs différentes pour "Motif d'appel"
    Le résultat trouvé lors du test:
    3 lignes avec 3 valeurs identiques pour "Motif d'appel" : cette mesure est dépendante de la table valmesu, mais je n'arrive pas à lui dire de rechercher dans la table.

    (Je n'ai pas mis dans mon exemple, mes essais qui ne fonctionnent pas)

    Si vous avez une idée.
    Merci.
    Si tu ne sais pas: demande, si tu sais, partage.

  10. #10
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Idéalement, il nous faudrait l'existant et la descrition de la modification souhaitée avec un petit jeu de test.
    En l'état qu'est-ce que donne ceci ?

    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 Trim(p.njfpat) ||' ' || Trim(p.nompat) ||'   ' ||trim(p.prepat) Nom_Prenom
         , DECODE(SEXE, 'M', 'M. ', 'F', 'Mme ', 'I', ' ')  GENRE, -- Genre du patient
         , Trim(TO_char(to_date(p.dtnais,'YYYYMMDD'),'DD/MM/YYYY')) Naissance
         , case when then m.mesure = 'xxxxxxxxx1' and nvl(m.etat,' ') != 'X' then m.resultat end  "Date d'examen"
         , case when then m.mesure = 'xxxxxxxxx2' and nvl(m.etat,' ') != 'X' then m.resultat end  "Heure d'examen"
         , case when then m.mesure = 'xxxxxxxxx3' and nvl(m.etat,' ') != 'X' then v.valeur   end  "Motif de l'appel"
         , case when then m.mesure = 'xxxxxxxxx4' and nvl(m.etat,' ') != 'X' then m.resultat end  "Précision motif de l'appel"
      from document formulaire
      join t_evt_rdv er   on er.noevt = formulaire.noevt
      join t_rdv r        on r.nordv = er.nordv
      join patient p      on p.nopat = er.nopat
      left join mesure m  on m.nodocument = formulaire.nodocument
      left join valmesu v on v.nomesure = m.nomesure
                         and ( nvl(v.etat, ' ') != 'X' )
     where formulaire.nodoctype in ('12345')        -- <- n° du formulaire 
       and nvl(formulaire.etat,' ') != 'X'
       and formulaire.typeevt = 'R'
       and r.date_debut > to_date('10/03/2023','DD/MM/YYYY')

Discussions similaires

  1. [2.x] Erreur sur requete avec jointure
    Par yasen77 dans le forum Symfony
    Réponses: 9
    Dernier message: 24/09/2014, 15h17
  2. erreur de syntaxe Mysql sur jointure ?
    Par evevev dans le forum Requêtes
    Réponses: 2
    Dernier message: 25/08/2010, 17h00
  3. [MySQL] Erreurs de syntaxe sur requêtes DELETE
    Par vincedjs dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 06/03/2006, 15h53
  4. Erreur de syntax sur JOIN
    Par helje dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/03/2006, 17h36
  5. Erreur de syntaxe sur la création d'une vue.
    Par cgougeon dans le forum Installation
    Réponses: 3
    Dernier message: 09/09/2005, 11h00

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