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

SQL Oracle Discussion :

Erreur : nom de colonne ambigu dans la liste de sélection


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut Erreur : nom de colonne ambigu dans la liste de sélection
    Bonjour

    je travaille sur une (très) vieille base Oracle 7 dans le cadre d'un stage
    j'utilise des connexion ODBC via Access 97 pour extraire les données en vue de la sauvegarder à plat

    j'ai une requête qui me sort une erreur qui semble explicite et pourtant je ne vois pas l'erreur
    erreur ORA-00960: Erreur nom de colonne ambigu dans la liste de sélection

    l'erreur se produit lorsque j'ajoute une table thésaurus (en rouge)
    pourtant, le nom du champ est préfixé du nom de la table

    d'avance merci pour votre aide

    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 
    ANAT_TABNUMERO_DOSSIER.ND_N_IDPATIENT, 
    ANAT_TABNUMERO_DOSSIER.ND_T_NUM_DOSSIER, 
    ANAT_TABNUMERO_DOSSIER.ND_T_NOM, 
    ANAT_TABNUMERO_DOSSIER.ND_T_PRENOM, 
    IIf(ANAT_TABNUMERO_DOSSIER.ND_N_SEXE='1','Masculin',IIf(ANAT_TABNUMERO_DOSSIER.ND_N_SEXE='2','Féminin','Non déterminé')) AS ND_N_SEXE, 
    ANAT_TABNUMERO_DOSSIER.ND_D_DATE_NAISS, 
    ANAT_TABNUMERO_DOSSIER.ND_T_IPUM, 
    ANAT_TABNUMERO_SIGMA.S_N_IDVENUE, 
    ANAT_TABNUMERO_SIGMA.S_T_SIGMA, 
    ANAT_TABPREALABLE_SPECIALITE.SPECIALITE_ID, 
    ANAT_TABPREALABLE_SPECIALITE.N_AGE, 
    ANAT_TABPREALABLE_SPECIALITE.D_DATE_EXAMEN, 
    ANAT_TABPREALABLE_SPECIALITE.T_NUM_EXAMEN, 
    ANAT_TABPREALABLE_SPECIALITE.T_DEMANDEUR, 
    ANAT_TABPREALABLE_SPECIALITE.T_NOM_DEMANDEUR, 
    ANAT_TABPREALABLE_SPECIALITE.T_ADR1, 
    ANAT_TABPREALABLE_SPECIALITE.T_ADR2, 
    ANAT_TABPREALABLE_SPECIALITE.T_CP, 
    ANAT_TABPREALABLE_SPECIALITE.T_VILLE, 
    ANAT_TABPREALABLE_SPECIALITE.T_EXAMEN_DIRECT, 
    ANAT_TABPREALABLE_SPECIALITE.T_RENS, 
    ANAT_TABPREALABLE_SPECIALITE.T_DENS_OD, 
    ANAT_TABPREALABLE_SPECIALITE.T_DENS_OG, 
    ANAT_TABPREALABLE_SPECIALITE.T_PHOTO_OD, 
    ANAT_TABPREALABLE_SPECIALITE.T_PHOTO_OG, 
    ANAT_TABPREALABLE_SPECIALITE.T_GOUTTES, 
    ANAT_TABPREALABLE_SPECIALITE.T_NOM_PHOTO_OD, 
    ANAT_TABPREALABLE_SPECIALITE.T_NOM_PHOTO_OG, 
    ANAT_TABPREALABLE_SPECIALITE.T_EXAMEN, 
    ANAT_TABPREALABLE_SPECIALITE.T_CONCLU, 
    ANAT_TABPREALABLE_SPECIALITE.T_COTATION, 
    ANAT_TABPREALABLE_SPECIALITE.T_PRN_DEMANDEUR, 
    ANAT_TABPREALABLE_SPECIALITE.T_EXAM_ANTERIEUR, 
    ANAT_TABPREALABLE_SPECIALITE.T_DS_OD, 
    ANAT_TABPREALABLE_SPECIALITE.T_DS_OG, 
    ANAT_TABPREALABLE_SPECIALITE.T_SURF_CM_OD, 
    ANAT_TABPREALABLE_SPECIALITE.T_SURF_CM_OG, 
    ANAT_TABPREALABLE_SPECIALITE.T_CV_OD, 
    ANAT_TABPREALABLE_SPECIALITE.T_CV_OG, 
    ANAT_TABPREALABLE_SPECIALITE.T_POLIT
    FROM ((ANAT_TABNUMERO_DOSSIER LEFT JOIN ANAT_TABNUMERO_SIGMA ON ANAT_TABNUMERO_DOSSIER.ND_N_IDPATIENT = ANAT_TABNUMERO_SIGMA.S_N_IDPATIENT) LEFT JOIN (ANAT_TABSPECIALITE_VENUE LEFT JOIN ANAT_TABPREALABLE_SPECIALITE ON ANAT_TABSPECIALITE_VENUE.SPECIALITE_ID = ANAT_TABPREALABLE_SPECIALITE.SPECIALITE_ID) ON ANAT_TABNUMERO_SIGMA.S_N_IDVENUE = ANAT_TABSPECIALITE_VENUE.SV_N_IDVENUE) LEFT JOIN ANAT_T_HOSPITALISE ON ANAT_TABPREALABLE_SPECIALITE.T_TYPE_HOSPI = ANAT_T_HOSPITALISE.T_CODE
    ORDER BY ANAT_TABNUMERO_DOSSIER.ND_N_IDPATIENT;

  2. #2
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    729
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 729
    Points : 1 414
    Points
    1 414
    Par défaut
    Bonsoir,

    Où la table thésaurus ?

    Avez vous testé de remplacer AS ND_N_SEXE par AS ND_N_SEXE2 ?
    Le savoir est une nourriture qui exige des efforts.

  3. #3
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    Bonjour

    merci pour votre réponse
    le problème ne se situe pas à ce niveau
    si je supprime la table thésaurus, pas de problème sur la requête

    la table thésaurus est surlignée en rouge dans la code que je remets ci-dessous

    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 
    ANAT_TABNUMERO_DOSSIER.ND_N_IDPATIENT, 
    ANAT_TABNUMERO_DOSSIER.ND_T_NUM_DOSSIER, 
    ANAT_TABNUMERO_DOSSIER.ND_T_NOM, 
    ANAT_TABNUMERO_DOSSIER.ND_T_PRENOM, 
    IIf(ANAT_TABNUMERO_DOSSIER.ND_N_SEXE='1','Masculin',IIf(ANAT_TABNUMERO_DOSSIER.ND_N_SEXE='2','Féminin','Non déterminé')) AS ND_N_SEXE, 
    ANAT_TABNUMERO_DOSSIER.ND_D_DATE_NAISS, 
    ANAT_TABNUMERO_DOSSIER.ND_T_IPUM, 
    ANAT_TABNUMERO_SIGMA.S_N_IDVENUE, 
    ANAT_TABNUMERO_SIGMA.S_T_SIGMA, 
    ANAT_TABPREALABLE_SPECIALITE.SPECIALITE_ID, 
    ANAT_TABPREALABLE_SPECIALITE.N_AGE, 
    ANAT_TABPREALABLE_SPECIALITE.D_DATE_EXAMEN, 
    ANAT_TABPREALABLE_SPECIALITE.T_NUM_EXAMEN, 
    ANAT_TABPREALABLE_SPECIALITE.T_DEMANDEUR, 
    ANAT_TABPREALABLE_SPECIALITE.T_NOM_DEMANDEUR, 
    ANAT_TABPREALABLE_SPECIALITE.T_ADR1, 
    ANAT_TABPREALABLE_SPECIALITE.T_ADR2, 
    ANAT_TABPREALABLE_SPECIALITE.T_CP, 
    ANAT_TABPREALABLE_SPECIALITE.T_VILLE, 
    ANAT_TABPREALABLE_SPECIALITE.T_EXAMEN_DIRECT, 
    ANAT_TABPREALABLE_SPECIALITE.T_RENS, 
    ANAT_TABPREALABLE_SPECIALITE.T_DENS_OD, 
    ANAT_TABPREALABLE_SPECIALITE.T_DENS_OG, 
    ANAT_TABPREALABLE_SPECIALITE.T_PHOTO_OD, 
    ANAT_TABPREALABLE_SPECIALITE.T_PHOTO_OG, 
    ANAT_TABPREALABLE_SPECIALITE.T_GOUTTES, 
    ANAT_TABPREALABLE_SPECIALITE.T_NOM_PHOTO_OD, 
    ANAT_TABPREALABLE_SPECIALITE.T_NOM_PHOTO_OG, 
    ANAT_TABPREALABLE_SPECIALITE.T_EXAMEN, 
    ANAT_TABPREALABLE_SPECIALITE.T_CONCLU, 
    ANAT_TABPREALABLE_SPECIALITE.T_COTATION, 
    ANAT_TABPREALABLE_SPECIALITE.T_PRN_DEMANDEUR, 
    ANAT_TABPREALABLE_SPECIALITE.T_EXAM_ANTERIEUR, 
    ANAT_TABPREALABLE_SPECIALITE.T_DS_OD, 
    ANAT_TABPREALABLE_SPECIALITE.T_DS_OG, 
    ANAT_TABPREALABLE_SPECIALITE.T_SURF_CM_OD, 
    ANAT_TABPREALABLE_SPECIALITE.T_SURF_CM_OG, 
    ANAT_TABPREALABLE_SPECIALITE.T_CV_OD, 
    ANAT_TABPREALABLE_SPECIALITE.T_CV_OG, 
    ANAT_TABPREALABLE_SPECIALITE.T_POLIT
    FROM ((ANAT_TABNUMERO_DOSSIER LEFT JOIN ANAT_TABNUMERO_SIGMA ON ANAT_TABNUMERO_DOSSIER.ND_N_IDPATIENT = ANAT_TABNUMERO_SIGMA.S_N_IDPATIENT) 
    LEFT JOIN (ANAT_TABSPECIALITE_VENUE LEFT JOIN ANAT_TABPREALABLE_SPECIALITE 
    ON ANAT_TABSPECIALITE_VENUE.SPECIALITE_ID = ANAT_TABPREALABLE_SPECIALITE.SPECIALITE_ID) 
    ON ANAT_TABNUMERO_SIGMA.S_N_IDVENUE = ANAT_TABSPECIALITE_VENUE.SV_N_IDVENUE) 
    LEFT JOIN ANAT_T_HOSPITALISE ON ANAT_TABPREALABLE_SPECIALITE.T_TYPE_HOSPI = ANAT_T_HOSPITALISE.T_CODE
    ORDER BY ANAT_TABNUMERO_DOSSIER.ND_N_IDPATIENT;

  4. #4
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    729
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 729
    Points : 1 414
    Points
    1 414
    Par défaut
    Bonjour,

    3 choses :
    - la table ANAT_T_HOSPITALISE n'est pas préfixée du nom du schéma comme les autres
    - utilisation des alias de tables serait plus confort et rationnel
    - quelle est la liste des colonnes de la table ANAT_T_HOSPITALISE ?
    Le savoir est une nourriture qui exige des efforts.

  5. #5
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    - la table ANAT_T_HOSPITALISE n'est pas préfixée du nom du schéma comme les autres
    si, elle l'est ??

    - utilisation des alias de tables serait plus confort et rationnel
    je travaille sur une vielle base de données que je n'ai pas conçu
    j'ai près de 1000 tables donc çà me parait pas envisageable

    - quelle est la liste des colonnes de la table ANAT_T_HOSPITALISE ?
    T_CODE (VARCHAR)
    T_LIBELLE (VARCHAR)
    N_RANG (Integer)

  6. #6
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Une bonne pratique est, quand tu as plusieurs tables dans le FROM, de préfixer CHAQUE table dans ton SELECT par le nom de son propriétaire, tu éviteras justement ce genre de message d'erreur que tu as.
    ATTENTION : c'est vrai pour la syntaxe propriétaire d'Oracle mais faux pour la syntaxe ANSI.

    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
    JOIN USING et NATURAL JOIN : il ne faut pas mettre de nom de table devant les colonnes de la  jointure, même si elles font partie du SELECT. C'est donc l'inverse de la syntaxe propriétaire d'Oracle où on aura le message d'erreur problème de "colonne ambiguë" avec la syntaxe Oracle classique.
     
    Syntaxe propriétaire d'Oracle : il faut préfixer par un nom de table le nom des colonnes existantes dans les deux tables.
              SQL> select TABLE_NAME from dba_tables, dba_tab_privs where dba_tables.TABLE_NAME = dba_tab_privs.TABLE_NAME;
              Erreur SQL : ORA-00918: définition de colonne ambigu
              00918. 00000 -  "column ambiguously defined"
     
    Avec ANSI92, la colonne TABLE_NAME servant à la jointure doit être utilisée sans préfixe de table.
              SQL> select TABLE_NAME from dba_tables JOIN dba_tab_privs USING (TABLE_NAME);
              2 024 lignes sélectionnées
     
              SQL> select dba_tables.TABLE_NAME from dba_tables JOIN dba_tab_privs USING (TABLE_NAME);
              Erreur SQL : ORA-25154: la partie colonne de la clause USING ne peut pas avoir de qualificatif
              25154. 00000 -  "column part of USING clause cannot have qualifier"
              *Cause:    Columns that are used for a named-join (either a NATURAL join or a join with a USING clause) cannot have an explicit qualifier.
     
    Même problème avec NATURAL JOIN.
              SQL> select dba_tables.TABLE_NAME from dba_tables NATURAL JOIN dba_tab_privs;
              Erreur SQL : ORA-25155: la colonne utilisée dans la jointure NATURAL ne peut pas avoir de qualificatif
              25155. 00000 -  "column used in NATURAL join cannot have qualifier"
              *Cause:    Columns that are used for a named-join (either a NATURAL join or a join with a USING clause) cannot have an explicit qualifier.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  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
    Je dirais que le problème provient de la ligne #6, mon Oracle 7 est un peu rouillé mais cette fonction IIF ne me dit rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IIf(ANAT_TABNUMERO_DOSSIER.ND_N_SEXE='1','Masculin',IIf(ANAT_TABNUMERO_DOSSIER.ND_N_SEXE='2','Féminin','Non déterminé')) AS ND_N_SEXE
    Utilisez la fonction decode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    decode(ANAT_TABNUMERO_DOSSIER.ND_N_SEXE, '1', 'Masculin', '2', 'Féminin', 'Non déterminé')
    Si ND_N_SEXE est de type NUMBER, enlevez les apostrophes autour des '1' et '2'.


    Sinon testez simplement la partie jointure comme ceci, votre code est difficile à relire : utiliser des alias est un excellent conseil qu'il faut appliquer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        select *
          from ANAT_TABNUMERO_DOSSIER       dos
     left join ANAT_TABNUMERO_SIGMA         sig on sig.S_N_IDPATIENT = dos.ND_N_IDPATIENT
     left join ANAT_TABSPECIALITE_VENUE     ven on ven.SV_N_IDVENUE  = sig.S_N_IDVENUE
     left join ANAT_TABPREALABLE_SPECIALITE spe on spe.SPECIALITE_ID = ven.SPECIALITE_ID
     left join ANAT_T_HOSPITALISE           hos on hos.T_CODE        = spe.T_TYPE_HOSPI;

  8. #8
    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
    Ah mais question bête... les jointures ANSI ne sont-elles pas arrivées en 8i ?

    C'est votre ACCESS qui fait correspondre des tables à Oracle ?

  9. #9
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    oui, tout à fait
    je requête depuis ACCESS avec des liens sur les tables d'une base oracle via ODBC
    donc la fonction IIF passe sans problème dans ACCESS
    je vais tester les alias et la piste d'Ikebukuro

    merci pour votre aide

  10. #10
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Petite précision : la bonne pratique est de préfixer tout nom de colonne par le nom de la table et, si besoin, par le nom du user.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  11. #11
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    J'ai essayé tous vos suggestions toujours sans succès

    je préfixe systématiquement les noms de champ par le nom de la table et c'est bien pourquoi je ne comprend l'erreur levée

  12. #12
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Merci de nous donner l'ordre SQL exécuté et le message d'erreur en une seule copie écran : soit en jpeg soir en png ou autre mais le message d'erreur va mettre une étoile (*) là où est le pb et donc on a besoin du message intégral.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  13. #13
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    Bonjour
    en fait, je n’exécute pas ma requête via sql*plus mais depuis Access

  14. #14
    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
    Le problème c'est que vous écrivez un requête dans access avec une syntaxe access, et c'est access qui s'occupe de transformer la requête en requête oracle pour exécution.
    Avec votre modification, la transformation d'access ne génère plus une requête oracle syntaxiquement valide.

    Je pense que le problème se situe au niveau des parenthèses, que vous n'avez pas géré de la même manière pour le dernier LEFT JOIN.
    Je ne connais pas les contraintes de syntaxe au niveau d'access, mais essayez de bidouiller la requête en rajoutant des parenthèses pour gérer la dernière table.

  15. #15
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    syntaxe Oracle qui fonctionne (n=5300)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT 
    ANAT.TABNUMERO_DOSSIER.ND_N_IDPATIENT,ANAT.TABPREALABLE_SPECIALITE.T_TYPE_HOSPI,ANAT.T_HOSPITALISE.T_LIBELLE 
    FROM 
    ANAT.TABNUMERO_DOSSIER, ANAT.TABNUMERO_SIGMA, ANAT.TABSPECIALITE_VENUE, ANAT.TABPREALABLE_SPECIALITE, ANAT.T_HOSPITALISE
    WHERE 
    ANAT.TABNUMERO_DOSSIER.ND_N_IDPATIENT(+)=ANAT.TABNUMERO_SIGMA.S_N_IDPATIENT AND
    ANAT.TABNUMERO_SIGMA.S_N_IDVENUE(+)=ANAT.TABSPECIALITE_VENUE.SV_N_IDVENUE AND
    ANAT.TABSPECIALITE_VENUE.SPECIALITE_ID(+)=ANAT.TABPREALABLE_SPECIALITE.SPECIALITE_ID AND
    ANAT.TABPREALABLE_SPECIALITE.T_TYPE_HOSPI(+)=ANAT.T_HOSPITALISE.T_CODE
    requete Access qui ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT ANAT_TABNUMERO_DOSSIER.ND_N_IDPATIENT,ANAT_TABPREALABLE_SPECIALITE.T_TYPE_HOSPI,ANAT_T_HOSPITALISE.T_LIBELLE 
    FROM 
    ((((ANAT_TABNUMERO_DOSSIER 
    LEFT JOIN ANAT_TABNUMERO_SIGMA ON ANAT_TABNUMERO_DOSSIER.ND_N_IDPATIENT = ANAT_TABNUMERO_SIGMA.S_N_IDPATIENT) 
    LEFT JOIN ANAT_TABSPECIALITE_VENUE ON ANAT_TABNUMERO_SIGMA.S_N_IDVENUE = ANAT_TABSPECIALITE_VENUE.SV_N_IDVENUE)
    LEFT JOIN ANAT_TABPREALABLE_SPECIALITE ON ANAT_TABSPECIALITE_VENUE.SPECIALITE_ID = ANAT_TABPREALABLE_SPECIALITE.SPECIALITE_ID ) 
    LEFT JOIN ANAT_T_HOSPITALISE ON ANAT_TABPREALABLE_SPECIALITE.T_TYPE_HOSPI = ANAT_T_HOSPITALISE.T_CODE)
    ORDER BY ANAT_TABNUMERO_DOSSIER.ND_N_IDPATIENT;
    faut que je vois comment supprimer les parenthèses si c'est possible

  16. #16
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    en fait je pense que le message d'erreur ne correspond pas à l'erreur levée
    en effet, si j'exécute la requête ci-dessous (filtre sur un champ non null), j'obtiens le même message d'erreur
    si je mets pas cette clause where, la requête s'exécute correctement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 
    ANAT_TABNUMERO_DOSSIER.ND_N_IDPATIENT, ANAT_TABNUMERO_DOSSIER.ND_T_NUM_DOSSIER, ANAT_TABNUMERO_DOSSIER.ND_T_NOM, ANAT_TABNUMERO_DOSSIER.ND_T_PRENOM, ANAT_TABNUMERO_DOSSIER.ND_N_SEXE, ANAT_TABNUMERO_DOSSIER.ND_D_DATE_NAISS, ANAT_TABNUMERO_DOSSIER.ND_T_IPUM, ANAT_TABNUMERO_SIGMA.S_N_IDVENUE, ANAT_TABNUMERO_SIGMA.S_T_SIGMA, ANAT_TABPREALABLE_SPECIALITE.SPECIALITE_ID, ANAT_TABPREALABLE_SPECIALITE.N_AGE, ANAT_TABPREALABLE_SPECIALITE.D_DATE_EXAMEN, ANAT_TABPREALABLE_SPECIALITE.T_NUM_EXAMEN, ANAT_TABPREALABLE_SPECIALITE.T_TYPE_HOSPI, ANAT_TABPREALABLE_SPECIALITE.T_DEMANDEUR, ANAT_TABPREALABLE_SPECIALITE.T_NOM_DEMANDEUR, ANAT_TABPREALABLE_SPECIALITE.T_ADR1, ANAT_TABPREALABLE_SPECIALITE.T_ADR2, ANAT_TABPREALABLE_SPECIALITE.T_CP, ANAT_TABPREALABLE_SPECIALITE.T_VILLE, ANAT_TABPREALABLE_SPECIALITE.T_EXAMEN_DIRECT, ANAT_TABPREALABLE_SPECIALITE.T_RENS, ANAT_TABPREALABLE_SPECIALITE.T_DENS_OD, ANAT_TABPREALABLE_SPECIALITE.T_DENS_OG, ANAT_TABPREALABLE_SPECIALITE.T_PHOTO_OD, ANAT_TABPREALABLE_SPECIALITE.T_PHOTO_OG, ANAT_TABPREALABLE_SPECIALITE.T_GOUTTES, ANAT_TABPREALABLE_SPECIALITE.T_NOM_PHOTO_OD, ANAT_TABPREALABLE_SPECIALITE.T_NOM_PHOTO_OG, ANAT_TABPREALABLE_SPECIALITE.T_EXAMEN, ANAT_TABPREALABLE_SPECIALITE.T_CONCLU, ANAT_TABPREALABLE_SPECIALITE.T_COTATION, ANAT_TABPREALABLE_SPECIALITE.T_PRN_DEMANDEUR, ANAT_TABPREALABLE_SPECIALITE.T_EXAM_ANTERIEUR, ANAT_TABPREALABLE_SPECIALITE.T_DS_OD, ANAT_TABPREALABLE_SPECIALITE.T_DS_OG, ANAT_TABPREALABLE_SPECIALITE.T_SURF_CM_OD, ANAT_TABPREALABLE_SPECIALITE.T_SURF_CM_OG, ANAT_TABPREALABLE_SPECIALITE.T_CV_OD, ANAT_TABPREALABLE_SPECIALITE.T_CV_OG, ANAT_TABPREALABLE_SPECIALITE.T_POLIT
    FROM (ANAT_TABNUMERO_DOSSIER LEFT JOIN ANAT_TABNUMERO_SIGMA ON ANAT_TABNUMERO_DOSSIER.ND_N_IDPATIENT = ANAT_TABNUMERO_SIGMA.S_N_IDPATIENT) LEFT JOIN (ANAT_TABSPECIALITE_VENUE LEFT JOIN ANAT_TABPREALABLE_SPECIALITE ON ANAT_TABSPECIALITE_VENUE.SPECIALITE_ID = ANAT_TABPREALABLE_SPECIALITE.SPECIALITE_ID) ON ANAT_TABNUMERO_SIGMA.S_N_IDVENUE = ANAT_TABSPECIALITE_VENUE.SV_N_IDVENUE
    WHERE ANAT_TABPREALABLE_SPECIALITE.T_NUM_EXAMEN is not null
    ORDER BY ANAT_TABNUMERO_DOSSIER.ND_N_IDPATIENT;

  17. #17
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    en fait, le problème vient du ORDER BY
    si je le supprime, pas de problème
    https://www.techonthenet.com/oracle/errors/ora00960.php

    je ne sais absolument pas pourquoi puisque je n'ai aucun nom de colonne identique dans le select

    je pense que je vais devoir faire sans Order by....

  18. #18
    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
    Essayez avec ORDER BY 1 pour voir ?

  19. #19
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    çà s'exécute mais qu'est ce je dois observer ???

  20. #20
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    729
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 729
    Points : 1 414
    Points
    1 414
    Par défaut
    Bonjour,

    La syntaxe des jointures dans Access est ... particulière : les parenthèses sont obligatoires à partir de la 3ieme source (2ieme jointure).
    Graphiquement ça correspond à l'ordre d'ajout des tables dans le designer
    Logiquement ça permet à Access de traiter les jointures une par une, en suivant l'ordre des parenthèses ; Access est un RBO, pas de statistiques => dans l'ordre d'écriture. (du moins c'est la conclusion à laquelle je suis arrivé).

    Il vaut mieux laisser Access écrire la clause FROM !

    Dans le designer en faisant clic droit sur la table -> propriété -> Alias (de mémoire) permet de faire les alias de table "graphiquement".

    Je me pose la question :
    Le choix d'Access est fait :
    1- parce qu'il existe une application toute développée que vous cherchez à améliorer ?
    2- votre choix perso pour avoir une interface graphique pour faire les requêtes (atelier de développement) ?
    Le savoir est une nourriture qui exige des efforts.

Discussions similaires

  1. erreur : nom de colonne ambigu
    Par info3licen dans le forum Langage SQL
    Réponses: 3
    Dernier message: 30/05/2011, 19h23
  2. Supprimer la colonne "Titre" dans les listes
    Par KL dans le forum SharePoint
    Réponses: 6
    Dernier message: 11/06/2009, 17h47
  3. probeleme des nom de colonnes ambigus dans une jointure
    Par devmassi dans le forum Ruby on Rails
    Réponses: 1
    Dernier message: 24/09/2008, 10h17
  4. [IBATIS] nom de colonne dynamique dans le mapping
    Par jgfa9 dans le forum Persistance des données
    Réponses: 1
    Dernier message: 02/01/2008, 14h01
  5. colonne affichée dans une liste déroulante
    Par Tierisa dans le forum Access
    Réponses: 4
    Dernier message: 13/10/2005, 16h13

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