Problème de requête sql
Le
PascalXLD
Bonjour
Voilà je dois executer une requete SQL sur une BDD HyperFile c/s
Je bataille déjà avec 2 tables mais il faudra passer à 3 après. Alo=
rs
je m'explique
J'ai une table "Materiel" et une table "Mouvement"
Je veux recuperer TOUT mon matériel et si il y a un mouvement dont la
date de sortie est vide récuperer l'"IdMouvement" (ensuite il faudra
recuperer la personne)
J'ai fait le code ci-dessous. Mais je recupere bien tout mon materiel
avec une date de sortie vide, je récupère bien mon materiel sans
mouvement, Mais je ne récupère pas mon materiel qui a un ou des
mouvements mais dont aucun n'a la date de sortie vide
Pourriez-vous me guider s'il vous plait.
SELECT Materiel.IDMateriel, Materiel.Modele_Materiel,
Materiel.Processeur_Ordi, Materiel.RAM_Ordi,
Materiel.HD_Ordi, Materiel.Ref_Interne_Materiel,
Materiel.Date_Achat_Materiel, Materiel.Date_Garantie_Materiel,
Materiel.Date_Sortie_Materiel, Materiel.Stand_By,
Materiel.Prevoir_Remplacement, Materiel.Prix_Achat_Materiel,
Materiel.IDType_Materiel,
Mouvement.IDMouvement
FROM Materiel LEFT OUTER JOIN Mouvement ON
(Materiel.IDMateriel=Mouvement.IDMateriel AND Mouvement.Date_Fin = '')
en résumé
En fait je veux récuperer toute la liste de mon materiel
1 - si il y a un mouvement dont la date de sortie est vide je veux
recuperer ce mouvement avec le materiel
2 - mais si il n'y a aucun mouvement je veux néanmoins recuperer mon
materiel.
3 - ou si il y a des mouvements mais tous avec une date de sortie je
veux néanmoins recuperer mon materiel.
J'ai bien les points 1 et 2 mais je n'arrive pas à avoir le 3 et
pourtnat le code sql doit être bon
Merci d'avance
Pascal
Voilà je dois executer une requete SQL sur une BDD HyperFile c/s
Je bataille déjà avec 2 tables mais il faudra passer à 3 après. Alo=
rs
je m'explique
J'ai une table "Materiel" et une table "Mouvement"
Je veux recuperer TOUT mon matériel et si il y a un mouvement dont la
date de sortie est vide récuperer l'"IdMouvement" (ensuite il faudra
recuperer la personne)
J'ai fait le code ci-dessous. Mais je recupere bien tout mon materiel
avec une date de sortie vide, je récupère bien mon materiel sans
mouvement, Mais je ne récupère pas mon materiel qui a un ou des
mouvements mais dont aucun n'a la date de sortie vide
Pourriez-vous me guider s'il vous plait.
SELECT Materiel.IDMateriel, Materiel.Modele_Materiel,
Materiel.Processeur_Ordi, Materiel.RAM_Ordi,
Materiel.HD_Ordi, Materiel.Ref_Interne_Materiel,
Materiel.Date_Achat_Materiel, Materiel.Date_Garantie_Materiel,
Materiel.Date_Sortie_Materiel, Materiel.Stand_By,
Materiel.Prevoir_Remplacement, Materiel.Prix_Achat_Materiel,
Materiel.IDType_Materiel,
Mouvement.IDMouvement
FROM Materiel LEFT OUTER JOIN Mouvement ON
(Materiel.IDMateriel=Mouvement.IDMateriel AND Mouvement.Date_Fin = '')
en résumé
En fait je veux récuperer toute la liste de mon materiel
1 - si il y a un mouvement dont la date de sortie est vide je veux
recuperer ce mouvement avec le materiel
2 - mais si il n'y a aucun mouvement je veux néanmoins recuperer mon
materiel.
3 - ou si il y a des mouvements mais tous avec une date de sortie je
veux néanmoins recuperer mon materiel.
J'ai bien les points 1 et 2 mais je n'arrive pas à avoir le 3 et
pourtnat le code sql doit être bon
Merci d'avance
Pascal

Poser une question


FROM Materiel
-- cas 1
where exists (select 1
from Mouvement
where Materiel.IDMateriel=Mouvement.IDMateriel
AND Mouvement.Date_Fin is null)
-- cas 2
or not exists (select 1
from Mouvement
where Materiel.IDMateriel=Mouvement.IDMateriel)
- cas 3 : si tous les mouvements ont une date <=> pas (un mouvement n'a pas
de date)
or not exists (select 1 from Mouvement
where Materiel.IDMateriel=Mouvement.IDMateriel
AND Mouvement.Date_Fin is null)
reste ensuite à faire les jointures nécessaires.
EN espérant avoir fait avancer le shmilblick
vous pouvez faire qq chose comme ca :
SELECT Materiel.IDMateriel, Materiel.Modele_Materiel,
Materiel.Processeur_Ordi, Materiel.RAM_Ordi,
Materiel.HD_Ordi, Materiel.Ref_Interne_Materiel,
Materiel.Date_Achat_Materiel, Materiel.Date_Garantie_Materiel,
Materiel.Date_Sortie_Materiel, Materiel.Stand_By,
Materiel.Prevoir_Remplacement, Materiel.Prix_Achat_Materiel,
Materiel.IDType_Materiel,
Mouvement.IDMouvement
FROM Materiel LEFT OUTER JOIN Mouvement ON
(Materiel.IDMateriel=Mouvement.IDMateriel)
WHERE Mouvement.Date_Fin
--
Cordialement JeAn-PhI
Pour Emmanuel je n'arrive pas à réécrire ton code. Peux-tu me filer un
coup de main STP?
Pour Jean-Phi Je ne crois pas que cela réponde à mon besoin
Ce que je ne comprends pas c'est que pourtant c'est bien le principe
du LEFT OUTER JOIN de récuperer les données de la table de gauche si
la condition de la jointure n'est pas remplie.
Si quelqu'un a une idée
Merci d'avance
Bonjour,
Windev n'aime pas les liaisons multiples sans alias. En plus, je n'ai
jamais réussi à faire fonctionner EXIST/NOT EXIST. Le suivant serait ma
version HF du code d'Emmanuel :
where IDMateriel IN (select IDMateriel AS IDM1 FROM Mouvement
WHERE Materiel.IDMateriel=Mouvement.IDMateriel
AND Mouvement.Date_Fin is null)
-- cas 2
or IDMateriel NOT IN (select IDMateriel AS IDM2 FROM Mouvement
WHERE Materiel.IDMateriel=Mouvement.IDMateriel)
- cas 3 : si tous les mouvements ont une date <=> pas (un mouvement n'a
pas de date)
or IDMateriel NOT IN (select IDMateriel AS IDM3 from Mouvement
where Materiel.IDMateriel=Mouvement.IDMateriel
AND Mouvement.Date_Fin is null)
Saltuations
Mat
...