Forum Clubic

[SQL] Problème jointures externes

Bonjour,
Voila je travail sous access et j’essaye de faire la requête suivante :


SELECT enr.Jour, enr.Heure, eq.Abrev, et.Etat_technique, p.Libelle FROM ENREGISTREMENT enr, EQUIPEMENT eq, ETAT et, PANNE p WHERE eq.Id_equip=enr.Id_equip AND enr.Id_enr=et.Id_enr(+) AND enr.Id_enr=p.Id_enr(+); 

Mais d’après ce que j’ai cru comprendre en faisant quelques recherches sur le net le ‘(+)’ fonctionne que sous oracle.
Donc comment je fais avec les join… car je ni comprend rien ?

(Sur un autre forum on m’a dit d’essayer :


SELECT enr.Jour, enr.Heure, eq.Abrev, et.Etat_technique, p.LibelleFROM ENREGISTREMENT enrINNER JOIN EQUIPEMENT eq ON eq.Id_equip=enr.Id_equipLEFT JOIN ETAT et ON et.Id_enr=enr.Id_enrLEFT JOIN PANNE p ON p.Id_enr=enr.Id_enr; 

mais celà me renvoit le message d’erreur suivant :


Erreur de syntaxe, (opérateur absent) dans l'expression 'eq.Id_equip=enr.Id_equip LEFT JOIN ETAT et ON et.Id_enr=enr.Id_enr LEFT JOIN PANNE p ON p.Id_enr=enr.Id_enr' 

)

Voilà j’espère que vous pourrez m’aider.

Probleme de parenthésage?


SELECT enr.Jour, enr.Heure, eq.Abrev, et.Etat_technique, p.LibelleFROM ENREGISTREMENT enr ((INNER JOIN EQUIPEMENT eq ON eq.Id_equip=enr.Id_equip) LEFT JOIN ETAT et ON et.Id_enr=enr.Id_enr) LEFT JOIN PANNE p ON p.Id_enr=enr.Id_enr; 

Essaie de faire tes requetes sous l’éditeur QBE d’access

non les parenthèses ne changent rien (je fais dejà les requêtes avec QBE).

SQL
[color=blue;font-weight:bold]SELECT[/color] enr.Jour, enr.Heure, eq.Abrev, et.Etat_technique, p.Libelle FROM ENREGISTREMENT enr ((INNER JOIN EQUIPEMENT eq ON eq.Id_equip=enr.Id_equip) LEFT JOIN ETAT et ON et.Id_enr=enr.Id_enr) LEFT JOIN PANNE p ON p.Id_enr=enr.Id_enr;

(notez l’espace entre p.Libelle et FROM)

Sinon la première requête sans les + devrait fonctionner ('fin j’utilise pas Access)

La j’ai le message d’erreur suivant : Erreur de syntaxe dans la clause FROM.

SQL
[color=blue;font-weight:bold]SELECT[/color] enr.Jour, enr.Heure, eq.Abrev, et.Etat_technique, p.Libelle

FROM ENREGISTREMENT enr
INNER JOIN EQUIPEMENT eq ON eq.Id_equip=enr.Id_equip
LEFT JOIN ETAT et ON et.Id_enr=enr.Id_enr
LEFT JOIN PANNE p ON p.Id_enr=enr.Id_enr;

LàN

non ça ne marche toujours pas :frowning: ça me remet le premier message d’erreur !

Help please !

t’est-il possible de décrire les schémas de tes tables stp ?

en mrd (sous cette forme là: )

TABLE ([clé_primaire], champ1, champ2, etc…, dernier_champ)

puis de nous dire clairement ce que tu souhaites faire comme requête en définissant en bon français ta question ?

Alors voilà la description des tables :


STATION([Id_station], Nom)
EQUIPEMENT([Id_equip], Abrev, Libelle, BG, BD, Id_station)
ENREGISTREMENT([Id_enr], Jour, Heure, Id_equip, Num_uf)
UF([Num_uf], [Id_equip], Id_uf, Libelle, Abrev)
VALEUR([Id_valeur], Id_enr, Id_etat, Id_param, Valeur)
ETAT([Id_etat], Num_etat, Id_enr, Libelle, Alarme)
PARAM([Id_param], Num param, Id_enr, Libelle)
PANNE([Num_panne], Id_enr, Libelle)

Il faut savoir qu’un enregistrement ne peux être que dans une des tables suivantes : ETAT, PARAM, PANNE

Donc en fait par exemple ce que je veux faire c’est sélectionner tous les enregistrements de la table ENREGISTREMENT ainsi que le champ valeur de la table VALEUR donc le Libelle de la table ETAT est renseigné et de même pour le Libelle de la table PARAM. Voilà j’espère que j’ai été assez clair :).

je pars en réunion avec mon directeur, je me penche sur ton souci juste après :wink:

Ok merci mais prends ton temps, je ne suis pas aux piéces ! :slight_smile:

Voilà ça sera plus simple :slight_smile: :

http://p2a06.free.fr/Image3.jpg

SELECT enr.Jour, enr.Heure, eq.Abrev, et.Etat_technique, p.Libelle
FROM EQUIPEMENT AS eq, ENREGISTREMENT AS enr LEFT JOIN ETAT AS et ON (et.Id_enr=enr.Id_enr) LEFT JOIN PANNE AS p ON (p.Id_enr=enr.Id_enr)
WHERE eq.Id_equip=enr.Id_equip

ou :

SELECT enr.Jour, enr.Heure, eq.Abrev, et.Etat_technique, p.Libelle
FROM EQUIPEMENT AS eq, PANNE AS p, ENREGISTREMENT AS enr LEFT JOIN ETAT AS et ON (et.Id_enr=enr.Id_enr AND p.Id_enr=enr.Id_enr)
WHERE eq.Id_equip=enr.Id_equip

Je viens d’essayer les 2 requêtes mais j’ai un message d’erreur : Erreur de syntaxe.
Je croyais que avec les jointures join on ne mettait pas de conditions de jointures dans le where non ?

Sinon j’essaye de sélectionner les enregistrements présents dans la table VALEUR et dans la table PANNE en faisant de la manière suivante :


select enr.Id_enr from ENREGISTREMENT enr where enr.Id_enr in (select Id_enr from PANNE) OR enr.Id_enr in (select Id_enr from VALEUR)

Mais comment je fais pour faire la même chose en utilisant les jointures car tout ce que j’ai essayé ne fonctionne pas.

Bonjour,
Maintenant qu’il y a le modèle graphique, c’est beaucoup plus simple :wink:
cf. ici la syntaxe des jointures:
http://cerig.efpg.inpg.fr/tutoriel/bases-d…nees/chap20.htm
Tu n’as pas forcément besoin d’une jointure externe, tu peux le faire en 2 requêtes avec des jointures interne, en SQL1, ta premère requête sans les (+) devrais marcher . (enfin avec le “in” ça marche, donc pas forcément utile…)

SQL
([color=blue;font-weight:bold]select[/color] enr.Id_enr from ENREGISTREMENT enr,PANNE pan where enr.Id_enr = pan.id_enr)

union
([color=blue;font-weight:bold]select[/color] enr.Id_enr from ENREGISTREMENT enr,VALEUR val where enr.Id_enr = val.id_enr)

mais pour retourner juste l’id, pas besoin de jointure:

Note: Les requêtes de sans-nom étaient correctes, d’après la doc. :??:

Je ne sais pas si ça influence les choses mais je travail sous Access et quand je regarde tout en bas de la page http://sql.developpez.com/sqlaz/jointures/ apparament Access n’accepte pas toutes les syntaxes !

Merci la requêtre avec l’union fonctionne mais en fait ça pause un problème, je m’explique.

Pour exploiter cette BD, j’ai créé un formulaire avec différent choix possibles. Donc selon les choix, mes jointures vont être différentes. Donc je pensais faire un système pour construire ma requête du style :


strSql = "SELECT " & Champs & " FROM " & Tables & " WHERE enr.Id_equip in (" & strChamps & ")" & Filtre & "

Ce qui me permet de renseigner la variables Tables de la manière suivante par exemple :


Tables = Tables & " Left Join STATION st On st.Id_station=eq.Id_station) INNER JOIN ENREGISTREMENT enr ON eq.Id_equip = enr.Id_equip"

Mais le problème c’est que apparament celà n’est pas possible puisqu’il faut définir un ordre de priorité pour les jointures avec les join. Par conséquent, je ne pourrais pas utiliser la méthode avec union.

Donc je ne sais pas si c’est une bonne idée mais je n’en vois pas d’autre, je pensais faire :


Select Case Choix
    Case "1" 'Table ETAT, VALEUR, ENREGISTREMENT, EQUIPEMENT, STATION
        Tables = "ETAT AS et INNER JOIN ((EQUIPEMENT AS eq LEFT JOIN STATION AS st ON eq.Id_station = st.Id_station) INNER JOIN (ENREGISTREMENT AS enr INNER JOIN VALEUR AS v ON enr.Id_enr = v.Id_enr) ON eq.Id_equip = enr.Id_equip) ON [et].Id_etat = v.Id_etat"
    Case "2" 'On choisit la table ETAT et la table PARAM
        Tables = "PARAM RIGHT JOIN ((ETAT RIGHT JOIN ((EQUIPEMENT INNER JOIN ENREGISTREMENT ON EQUIPEMENT.Id_equip = ENREGISTREMENT.Id_equip) INNER JOIN VALEUR ON ENREGISTREMENT.Id_enr = VALEUR.Id_enr) ON ETAT.Id_etat = VALEUR.Id_etat) INNER JOIN STATION ON EQUIPEMENT.Id_station = STATION.Id_station) ON PARAM.Id_param = VALEUR.Id_param"
    Case "3" 'On choisit que la table PARAM
        Tables = "PARAM INNER JOIN (((EQUIPEMENT INNER JOIN ENREGISTREMENT ON EQUIPEMENT.Id_equip = ENREGISTREMENT.Id_equip) INNER JOIN VALEUR ON ENREGISTREMENT.Id_enr = VALEUR.Id_enr) INNER JOIN STATION ON EQUIPEMENT.Id_station = STATION.Id_station) ON PARAM.Id_param = VALEUR.Id_param"
    Case "4" 'On choisit que la table PANNE
        Tables = "((EQUIPEMENT INNER JOIN ENREGISTREMENT ON EQUIPEMENT.Id_equip = ENREGISTREMENT.Id_equip) INNER JOIN STATION ON EQUIPEMENT.Id_station = STATION.Id_station) INNER JOIN PANNE ON ENREGISTREMENT.Id_enr = PANNE.Id_enr"
    Case "5" 'On choisit les table ETAT et PANNE
        Tables = ""
    Case "6" 'On choisit les table PARAM et PANNE
        Tables = ""
    Case Else
        MsgBox ("Problème dans les jointures.")
End Select

J’essaye de faire une requête qui me permet de récupérer les Id_enr de la table enregistrement dont les Id_enr sont à la fois dans les tables ETAT et PANNE mais je ni parvient pas. Cela fonctionne quand je met la table VALEUR et PANNE mais pas quand je rajoute la table ETAT.
Voici ce que cela donne :
http://p2a06.free.fr/requete.JPG

help :’(