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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Emmanuel LECOESTER
Le #14598861
SELECT Materiel.IDMateriel
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
JeAn-PhI
Le #14598831
PascalXLD a présenté l'énoncé suivant :
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. Alors
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


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 <> '' OR Mouvement.Date_Fin = ''

--
Cordialement JeAn-PhI
PascalXLD
Le #14598741
Alors retour après essai

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
mat
Le #14598711
PascalXLD wrote:
Alors retour après essai

Pour Emmanuel je n'arrive pas à réécrire ton code. Peux-tu me filer un
coup de main STP?




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
mat
Le #14598701
...
Windev n'aime pas les liaisons multiples AU MEME FICHIER sans alias.


...
mat
Le #14598681
mat wrote:

comme je disais le problème peut exister lors de liaisons multiples au
même fichier, donc l'alias devrait être sur le fichier pas sur la rubrique:



where IDMateriel IN (select IDMateriel FROM Mouvement AS M1
WHERE Materiel.IDMateriel=M1.IDMateriel
AND M1.Date_Fin is null)

-- cas 2
or IDMateriel NOT IN (select IDMateriel FROM Mouvement AS M2
WHERE Materiel.IDMateriel=M2.IDMateriel)

- cas 3 : si tous les mouvements ont une date <=> pas (un mouvement n'a
pas de date)
or IDMateriel NOT IN (select IDMateriel from Mouvement AS M3
where Materiel.IDMateriel=M3.IDMateriel
AND M3.Date_Fin is null)

Saltuations
Mat


PascalXLD
Le #14598671
Ok merci Mat

je regarderai cela demain et je vous tiens au courant
PascalXLD
Le #14594691
Re

Alors pour conclure j'ai fait un truc de ce genre là

MaReqSQLBase1="SELECT Materiel.IDMateriel AS 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,"+...
"Personne.Nom_Personne+' '+ Personne.Prenom_Personne "+...
" FROM Personne, Mouvement,Materiel "+...
"WHERE Personne.IDPersonne = Mouvement.IDPersonne AND
Materiel.IDMateriel = Mouvement.IDMateriel AND (Mouvement.Date_Fin =
'') AND "

MaReqSQLBase2="SELECT DISTINCT Materiel.IDMateriel AS 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,"+...
"' ' "+...
" FROM Materiel "+...
"WHERE Materiel.IDMateriel NOT IN(SELECT Materiel.IDMateriel AS
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,"+...
"Personne.Nom_Personne+' '+ Personne.Prenom_Personne "+...
" FROM Personne, Mouvement,Materiel "+...
"WHERE Personne.IDPersonne = Mouvement.IDPersonne AND
Materiel.IDMateriel = Mouvement.IDMateriel AND (Mouvement.Date_Fin =
'')) AND "

j'ai donc fait 2 requêtes
ensuite ces 2 requêtes sont complétées (suite à des saisies)
et je fais un union de 2

Merci pour votre aide
Publicité
Poster une réponse
Anonyme