begin process at 2012 05 26 21:34:18
  Trouver un code source :
 
dans
 
Accueil > Forum > 

SQL

 > 

Autre

 > 

Divers

 > 

Requète imbriquée


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Requète imbriquée

jeudi 2 septembre 2010 à 10:56:44 | Requète imbriquée

rbellot

Bonjour,

Je rencontre un problème de liaison de deux tables:
j'ai un première table qui contient des véhicules VEHIC et une autre table qui contient les enregistrements planning de ces véhicules.
Je souhaite pour une période donnée récupérer tous les enregistrement planning. Mais le problème est que je n'ai pas les véhicules qui ne sont pas utilisés au planning...et il me les faut.

Afin d'être optimal, j'ai créé une jointure et traité le problème du planning. Je cherche une solution élégante et performante (client/serveur)qui me permette d'y intégrer les véhicules absents du planning.

Une première piste est d'utiliser une requète intégrée : mais pas très optimale.
Une deuxième piste est de créer une deuxième requète derrière et de compléter la première: pas terrible non plus !

Qu'en pensez-vous ?

Merci pour vos réponses.

Richard
jeudi 2 septembre 2010 à 11:22:23 | Re : Requète imbriquée

casy

Membre Club
Une simple requete sur la table VEHIC avec jointure externe gauche sur la table planning devrait suffire, non ?


---- Sevyc64 (alias Casy) ----

# LE PARTAGE EST NOTRE FORCE #
jeudi 2 septembre 2010 à 11:48:50 | Re : Requète imbriquée

rbellot

Merci Casy

Genre:
Select
Planning.Id_Vehic
...
...
Vehic.Id_Vehic
...
...
From
Vehic Left outer join Planning on vehic.id_Vehic = planning.id_vehic
Where
planning.dateDebut >= pdatedebut and planning.dateFin <= pdatefin
Order by
...

Résultat : si les véhicules ne sont pas dans le planning ils n'apparaissent pas. Hors il me les faut, même à vide.

Comment faire ?
jeudi 2 septembre 2010 à 11:57:11 | Re : Requète imbriquée

casy

Membre Club
Il n'apparaissent pas à cause de la clause Where.

Pour qu'ils apparaissent, il faut rajouter le cas ou il n'y a pas de planning, c'est à dire ou Planning.dateDebut et Planning.dateFin sont nuls

Code :
Where
(planning.dateDebut >= pdatedebut and planning.dateFin <= pdatefin)
OR
(planning.dateDebut is Null and planning.dateFin is null)


---- Sevyc64 (alias Casy) ----

# LE PARTAGE EST NOTRE FORCE #
jeudi 2 septembre 2010 à 12:20:36 | Re : Requète imbriquée

rbellot

Après essai le résultat est le même.

Si on paramètre avec une journée sans planification, il ne ramène rien.

En fait les dates ne sont pas null (si j'ai bien compris ?) mais l'enregistrement est absent dans le planning. Est ce que le Null = rubrique vide ?
jeudi 2 septembre 2010 à 14:11:28 | Re : Requète imbriquée

casy

Membre Club
Ok, je me suis un peu mélangé les pinceaux.
J'étais parti sur l'idée que les véhicules que tu ne vois pas n'avait pas du tout de planification. Or, ils ont bien des planifications mais en dehors de la plage souhaitée. Donc forcément ma requete ne marche pas.

Il faut effectivement des requetes imbriquées. La jointure se faisant ici, non pas sur la table planning, mais sur table temporaire ne contenant que les planifications dans la plage de date souhaité. D'ailleurs la jointure sera plutôt à ce moment là une externe droite :

Code :
SELECT P.Id_Vehic,...,V.Id_Vehic,..... FROM 
  (SELECT * FROM Planning 
   WHERE (Planning.dateDebut >= pdatedebut  and 
          Planning.dateFin <= pdatefin)
   ) P
RIGHT OUTER JOIN Vehic V ON P.Id_Vehic=V.Id_Vehic 


Attention, les champs "plannings" dans la clause SELECT ne viennent plus de la table Planning, mais de la table temporaire P

En espérant que cette fois-ci, ça marche

---- Sevyc64 (alias Casy) ----

# LE PARTAGE EST NOTRE FORCE #
jeudi 2 septembre 2010 à 19:16:11 | Re : Requète imbriquée

rbellot

Merci casy de venir bruler tes neurones avec moi
Excuses moi mais j'étais chez un client cet AM.

Voici le code que j'ai testé
SELECT
v.id_VEHIC AS id_VEHIC,
V.NBR_PLACE AS NBR_PLACE,
V.VehicActif AS VehicActif,
V.VehicAFF AS VehicAFF,
V.catVehic AS catVehic,
V.id_TY_VEHI AS id_TY_VEHI,
V.Cle_Rang AS Cle_Rang,
V.dateSup AS dateSup,
V.PLQ_NUM AS PLQ_NUM,
V.desig50 AS desig50,
P.PGCLEUNIK AS PGCLEUNIK,
P.date_debut AS date_debut,
P.Heure_Debut AS Heure_Debut,
P.date_fin AS date_fin,
P.HEURE_FIN AS HEURE_FIN,
P.Lib_planning AS Lib_planning,
P.lib_survol AS lib_survol,
P.Typ_Mission AS Typ_Mission,
P.Cli_Option AS Cli_Option,
P.Id_MISSION AS Id_MISSION,
P.id_VEHIC AS id_VEHIC,
P.Id_M_Vehic AS Id_M_Vehic,
P.IDLg_Mission AS IDLg_Mission,
P.IDINTTECH AS IDINTTECH
FROM
(SELECT * FROM PLANNING_VEHIC
WHERE (PLANNING_VEHIC.date_debut >= {pDateDebut} AND
PLANNING_VEHIC.date_fin <= {pDateFin})
) P
RIGHT OUTER JOIN VEHIC V ON P.id_VEHIC = V.id_VEHIC

ORDER BY
id_VEHIC ASC

et le résultat est identique: aucun enregistrement ne remonte quand je paramètre un jour sans enregistrement dans la table planning_vehic.

Pourrais tu m'expliquer la différence entre jointure gauche et droite: j'ai cru comprendre une différence de cardinalité L(1,0) et R(1,+).

Par rapport à ton code ta requète sur le planning me parait bonne, par contre la recherche des véhicules absents dans la table planning et présents dans la table vehicule semble poser un problème.
Est ce que l'utilisation de is not ne serait pas une solution peut être dans une autre sous requète concernant les véhicules ? Ce n'est pas très élégant...
Ou l'élimination d'une intersection ?

Merci
jeudi 2 septembre 2010 à 20:20:52 | Re : Requète imbriquée

casy

Membre Club
Je pense que ta requete génère une erreur sur la clause ORDER BY, le nom id_VEHIC est ambiguë.

En effet, dans ton résultat, tu as 2 champs (alias) dont le nom retourné est id_VEHIC, le moteur SQL ne doit pas savoir sur lequel faire le ORDER BY.

Soit tu donne à chaque champ un nom unique, soit dans la clause ORDER BY, tu précise de quelle table le champ vient : ORDER BY P.id_VEHIC


---- Sevyc64 (alias Casy) ----

# LE PARTAGE EST NOTRE FORCE #
jeudi 2 septembre 2010 à 22:32:15 | Re : Requète imbriquée

rbellot

Bonsoir,

J'ai supprimé la clause order by et je teste :

Si je teste sur un jour où il n'y a aucun enregistrement dans le planning, donc la requète devrait ramener au moins les véhicules: le résultat est "pas d'enregistrement"

Si je teste sur un jour où il y a des enregistrements, il généère une erreur de code sql sur <P> : pourquoi, je ne sais.

Dans tous les cas si j'ai bien compris ton code,le right outer join portant sur vehic ne peut me semble-t-il satisfaire la condition car elle n'existe pas, l'enregistrement côté planning étant absent. Peut être existe-t-il une clause absent, is not ??? unknown ???

Merci

Richard (je suis absent demain, je pourrai lire ta réponse mes pas la tester avant samedi matin)

vendredi 3 septembre 2010 à 08:48:56 | Re : Requète imbriquée

casy

Membre Club
Pour ce qui est des jointures, je te conseille de lire ce document. Il t'apportera, j'espère, quelques précisions quant à leur fonctionnements.

[ Lien ]


Pour ce qui est de ta requete, l'absence de résultat ne vient pas (pour le moment en tout cas) d'un problème de jointure, mais simplement du fait que ta requete ne s'execute pas car elle comporte une erreur.

D'après le message que tu rapporte, ton moteur de base de donnée ne semble pas comprendre la syntaxe utilisée pour donner l'alias P à la requete intermédiaire.
Cette syntaxe marche telle quelle sous SQLServer. Je ne connais pas ton SGBD, mais il faudrait vérifier la syntaxe qu'il attend concernant les alias de tables.


---- Sevyc64 (alias Casy) ----

# LE PARTAGE EST NOTRE FORCE #

1 2

Cette discussion est classée dans : problème, première, requète, planning, véhicules


Répondre à ce message

Sujets en rapport avec ce message

problème d'installation de mysql [ par kermina ] bonjour, j'ai un problème dans l'installation de mysql, la première fois j'ai installé la version 5.5, et après j'ai voulu installé la version 5.0, a problème connexion mysql et 1&1 [ par 73volts ] hello j arrive pas à mettre en ligne mon site. j ai transféré tous le contenu du dossier www de movamp avec la même arborrescence. voici mon problème. Problème concatenation avec lettre arabe [ par slash0388 ] Bonjour, voilà j'ai un champs dans lequel je stock des données en lettre arabe et quand j'essai de concatener celui ci avec d'autre champs contenant d [clos] problème avec mes ID [ par msi079 ] dans ma base de donnée mysql . j'avai des enregistrements que j'ai supprimés .lorsque je fai de nouveaux enregistrements je remarque que le ID ne se r problème de démarrage de Apache [ par boualiasma ] Bonjour, Je voulais travailler avec le SGBD Mysql avec EasyPHP pour la création de base des données. Lorsque je démarre EasyPHP je remarque que le M probleme de virgule [ par colonelblondass ] Bonjour à vous Forum, J'ai un énorme problème en SQL. J'ai une table avec plus de 21 millions d'enregistrements et en l'important, la colonne avec l help [ par khoukha12 ] slt J'ai un problème je l'espère vous m'aider . Mon problème dans SQL SEVER 2005 il n'accepte pas le mot clé "AS" : [code=autre]create type type_Coo problème avec la requête select [ par hajerkerkena ] bonjour, je trouve un problème avec la requête select avec condition sur deux champs. voici ma requête string strcmd = "select count(*) from personne Récup des lancements de batch [ par jpvito ] Bonjour, Voici le contexte : Des batchs sont lancés par une autre équipe et je ne dispose pas du planning de lancements de ceux-ci. Je cherche donc problème conversion chaîne en number avec TO_NUMBER [ par Jordan59 ] Bonsoir à tous Je rencontre un petit souci de conversion de chaîne en numérique. J'ai des nombres décimaux ('1234.56' et '1234,56') stocké dans un


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,682 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales