Jointure externe

Jointure externe - SQL/NoSQL - Programmation

Marsh Posté le 25-04-2006 à 14:13:36    

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

Code :
  1. SELECT enr.Jour, enr.Heure, eq.Abrev, et.Etat_technique, p.Libelle
  2. FROM ENREGISTREMENT enr, EQUIPEMENT eq, ETAT et, PANNE p
  3. 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 :d ?


Message édité par hacksi le 25-04-2006 à 14:14:07
Reply

Marsh Posté le 25-04-2006 à 14:13:36   

Reply

Marsh Posté le 25-04-2006 à 14:55:34    

Code :
  1. SELECT enr.Jour, enr.Heure, eq.Abrev, et.Etat_technique, p.Libelle
  2. FROM ENREGISTREMENT enr
  3. INNER JOIN EQUIPEMENT eq ON eq.Id_equip=enr.Id_equip
  4. LEFT JOIN ETAT et ON et.Id_enr=enr.Id_enr
  5. LEFT JOIN PANNE p ON p.Id_enr=enr.Id_enr;

Reply

Marsh Posté le 25-04-2006 à 15:02:35    

Merci pour ton aide mais ça ne marche pas.
Message d'erreur :  

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

Reply

Marsh Posté le 02-05-2006 à 13:27:20    

Help please :)

Reply

Marsh Posté le 02-05-2006 à 13:48:34    

Code :
  1. SELECT enr.Jour, enr.Heure, eq.Abrev, et.Etat_technique, p.Libelle
  2. FROM ((ENREGISTREMENT enr
  3. INNER JOIN EQUIPEMENT eq ON eq.Id_equip=enr.Id_equip)
  4. LEFT JOIN ETAT et ON et.Id_enr=enr.Id_enr)
  5. LEFT JOIN PANNE p ON p.Id_enr=enr.Id_enr;

Reply

Marsh Posté le 02-05-2006 à 13:57:09    

ça à l'air de marcher merci :d
Mais peux-tu m'expliquer la logique des parenthèses stp

Reply

Marsh Posté le 02-05-2006 à 15:46:04    

Les tables sont jointes entre elles deux à deux.  
 
Ne pas mettre de parenthese ci-dessus équivaut à faire sous Oracle un WHERE t1.id = t2.id = t3.id = t4.id ce qui est contraire à la logique du SQL.
 
Si tu met des parentheses, sous Access tu as les étapes suivantes :
 
Etape 1
t1 INNER JOIN t2 ON t1.id = t2.id
Te voila avec une nouvelle table fictive qui est le résultat de la jointure entre t1 et t2.
 
Etape 2
(t1.id INNER JOIN t2.id ON t1.id = t2.id) LEFT JOIN t3 ON t1.id = t3.id
Tu fais une jointure entre la nouvelle table obtenu à l'étape 1 et la table t3. Tu obtiens une nouvelle table fictive qui est le fruit de tes deux jointures successives.
 
Etape 3
((t1.id INNER JOIN t2.id ON t1.id = t2.id) LEFT JOIN t3 ON t1.id = t3.id) LEFT JOIN t4 ON t1.id = t4.id
Même explication qu'a l'étape 2.
 
En résumant tu es contraint sous Access de déterminer l'ordre dans lequel il executera tes produits de jointures par des parentheses :) !
 
En espérant que ce soit assez clair, car quand je me relis, j'en ai pas l'air :D !
 
 

Reply

Marsh Posté le 03-05-2006 à 15:23:53    

Ok merci pour ces renseignement.
 
Sinon j'ai une autre petite question : comment je transforme la requête suivante pour utiliser des jointures ?  

Code :
  1. 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)


Message édité par hacksi le 03-05-2006 à 15:28:42
Reply

Marsh Posté le 03-05-2006 à 21:07:55    

Personne ?


Message édité par hacksi le 03-05-2006 à 21:10:14
Reply

Marsh Posté le 04-05-2006 à 09:16:54    

Tu peux faire un INNER JOIN entre Enregistrement et un UNION de tes deux requetes entre parentheses...par contre je comprend pas la logique de la manoeuvre, la requete que tu met juste au dessus ressort bien les résultats que tu veux ?

Reply

Marsh Posté le 04-05-2006 à 09:16:54   

Reply

Marsh Posté le 05-05-2006 à 09:08:06    

Voila ça sera peut-être plus simple à comprendre.
http://p2a06.free.fr/Image3.jpg
Donc en fait oui la requête me renvoit bien ce que je veux car en fait je cherche tous les enregistrements qui sont à la fois dans la table PANNE et dans la table VALEUR.
 
 
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 :

Code :
  1. 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 :

Code :
  1. 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 :

Code :
  1. Select Case Choix
  2.    Case "1" 'Table ETAT, VALEUR, ENREGISTREMENT, EQUIPEMENT, STATION
  3.        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"
  4.    Case "2" 'On choisit la table ETAT et la table PARAM
  5.        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"
  6.    Case "3" 'On choisit que la table PARAM
  7.        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"
  8.    Case "4" 'On choisit que la table PANNE
  9.        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"
  10.    Case "5" 'On choisit les table ETAT et PANNE
  11.        Tables = ""
  12.    Case "6" 'On choisit les table PARAM et PANNE
  13.        Tables = ""
  14.    Case Else
  15.        MsgBox ("Problème dans les jointures." )
  16. End Select

Reply

Marsh Posté le 09-05-2006 à 10:00:20    

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


Message édité par hacksi le 09-05-2006 à 10:01:47
Reply

Marsh Posté le 09-05-2006 à 10:29:05    

Utilise l'interface graphique de Access; elle est faite justement pour ne pas se prendre la tête quand on ne maîtrise pas son langage SQL un peu spécifique.
Et quand ta requête est finalisée et fonctionnelle, tu affiches son code SQL et tu le copies dans ton code.

Reply

Marsh Posté le 09-05-2006 à 11:04:00    

lol bin la capture d'écran que j'ai affiché, c'est en utilisant l'interface graphique...

Reply

Marsh Posté le 09-05-2006 à 11:08:27    

J'ai pas les images (filtrées) désolé.

Reply

Marsh Posté le 15-05-2006 à 16:27:09    

help !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed