OVH Cloud OVH Cloud

[SQL]Problème avec un jointure

1 réponse
Avatar
Alex
Pr=E9sentation du probl=E8me=20

Je poss=E8des 4 tables :=20
- FilterCrit : Qui contient des id de crit=E8re=20
- Crit=E8re : Liste des crit=E8res=20
- Mod_Crit : Jointure entre crit=E8res et mod=E8le=20
- Model : Liste des mod=E8les=20

Je voudrai afficher la liste des mod=E8les selon 0 ou N=20
crit=E8res qui sont stock=E9 dans la tables FilterCrit.=20

Le probl=E8me est que la requ=E8te ci dessous me renvoi les=20
mod=E8les avec une condition OU sur les crit=E8res et pas ET.=20
exemple :=20
Je voudrai les mod=E8les dont le crit=E8re est xx ET yy=20


Requ=E8te:=20
SELECT dbo.Critere.nom, dbo.Model.nom AS Expr1=20
FROM dbo.Critere INNER JOIN=20
dbo.Mod_Crit ON dbo.Critere.id =3D dbo.Mod_Crit.idCrit=20
INNER JOIN=20
dbo.Model ON dbo.Mod_Crit.idMod =3D dbo.Model.id INNER JOIN=20
dbo.FilterCrit ON dbo.Critere.id =3D dbo.FilterCrit.id=20
WHERE (dbo.FilterCrit.uId =3D 0)=20


Faut il faire une requ=E8te imbriqu=E9e, utiliser EXISTS ?

1 réponse

Avatar
Sylvain Lafontaine
Bonjour,

Pour avoir un ET, vous devez utilisez un Not Exists et non pas un
Exists, genre:

... Where (Not Exists (select * from dbo.FilterCrit where
dbo.FilterCrit.IdCrit = dbo.Critere.Id and uId <> 0))

J'ai écrit ici IdCrit au lieu de Id à gauche car j'imagine que vous
vouliez écrire "dbo.Critere.id = dbo.FilterCrit.idCrit"
au lieu de "dbo.Critere.id = dbo.FilterCrit.id" juste avant votre WHERE.

Selon le cas, la fonction Not In pourrait également donner de meilleures
performances.

Généralement, ce genre de problème peut devenir très complexe dans une
requête et il est souvent préférable d'utiliser une table temporaire, d'y
mettre dedans tous les critères possibles et ensuite d'éliminer en
conséquence ceux qui ne sont pas bons.

S. L.

"Alex" wrote in message
news:14eb101c3fa2c$57733960$
Présentation du problème

Je possèdes 4 tables :
- FilterCrit : Qui contient des id de critère
- Critère : Liste des critères
- Mod_Crit : Jointure entre critères et modèle
- Model : Liste des modèles

Je voudrai afficher la liste des modèles selon 0 ou N
critères qui sont stocké dans la tables FilterCrit.

Le problème est que la requète ci dessous me renvoi les
modèles avec une condition OU sur les critères et pas ET.
exemple :
Je voudrai les modèles dont le critère est xx ET yy


Requète:
SELECT dbo.Critere.nom, dbo.Model.nom AS Expr1
FROM dbo.Critere INNER JOIN
dbo.Mod_Crit ON dbo.Critere.id = dbo.Mod_Crit.idCrit
INNER JOIN
dbo.Model ON dbo.Mod_Crit.idMod = dbo.Model.id INNER JOIN
dbo.FilterCrit ON dbo.Critere.id = dbo.FilterCrit.id
WHERE (dbo.FilterCrit.uId = 0)


Faut il faire une requète imbriquée, utiliser EXISTS ?