Resultat incompréhensible

Résolu
JALEO WAHRANI Messages postés 17 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 14 février 2008 - 9 août 2007 à 11:36
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 - 22 août 2007 à 22:42
Bonjour, j'ai une base avec 2 tables: 'perso et client',

perso a pour colonnes:
id, prop, etat

état vaut 'Y' si on effectue un suivi, sinon (par défaut) 'N'.

client a pour colonnes:
ref, nom

Sachant que pour une ligne dans client il n'y a pas obligatoirement de ligne dans perso.

Diverses requêtes fonctionnent très bien, mais avec une j'ai un problème;

SELECT * FROM client AS t1 LEFT JOIN (SELECT * FROM perso WHERE prop=3) AS t2 ON t1.ref=t2.id WHERE t2.etat='Y'

me retourne bien toutes les lignes pour lesquelles état='Y'

par contre, moi ce qui m'interesse c'est de récupérer les lignes pour lesquelles état est différent de 'Y' soit 'N' soit NULL.

J'ai essayé une solution propre:
SELECT * FROM client AS t1 LEFT JOIN (SELECT * FROM perso WHERE prop=3) AS t2 ON t1.ref=t2.id WHERE t2.etat!='Y'

et une solution sale:
SELECT * FROM client AS t1 LEFT JOIN (SELECT * FROM perso WHERE prop=3) AS t2 ON t1.ref=t2.id WHERE t2.etat='N' OR t2.etat=NULL

et rien à faire dans tous les cas, il n'y a pas de réponses retournées alors que si je fais un simple:
SELECT * FROM client AS t1 LEFT JOIN (SELECT * FROM perso WHERE prop=3) AS t2 ON t1.ref=t2.id WHERE 1

Toutes les lignes apparaissent (celles pour qui état vaut 'Y' et celles pour qui etat vaut NULL)

Si vous avez des solutions ça pourrait bien m'aider car je me casse le sdents sur ce probème depuis un petit moment et je commence à prendre du retard.

Merci d'avance à vous tous.

4 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
9 août 2007 à 19:17
Salut,

NULL n'est pas une valeur, c'est NULL, une absence de valeur.
Donc NULL n'est pas différent de 'Y'.
Tout comme NULL est différent de NULL.

Ta requête doit plutot être
SELECT * FROM client AS t1 LEFT JOIN (SELECT * FROM perso WHERE prop=3) AS t2 ON t1.ref=t2.id WHERE t2.etat!='Y' OR t2.etat IS NULL

/*
coq
MVP Visual C#
CoqBlog
*/
3
JALEO WAHRANI Messages postés 17 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 14 février 2008
9 août 2007 à 12:10
Excusez-moi pour le post en double, mais j'ai fait une erreur dans ma question: en fait, la requête:

SELECT * FROM client AS t1 LEFT JOIN (SELECT * FROM perso WHERE prop=3) AS t2 ON t1.ref=t2.id WHERE t2.etat!='Y'

renvoie bien en reponse les lignes qui existent avec etat='N' mais ne renvoie par les lignes qui n'existent pas (etat=NULL)
0
JALEO WAHRANI Messages postés 17 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 14 février 2008
11 août 2007 à 19:49
Merci beaucoup pour ta réponse, c'est une vraie réponse: tu prends non seulement le temps de donner la solution mais en plus tu expliques pourquoi.
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
22 août 2007 à 22:42
Avec SQL-Server on aurait fait :

WHERE isnull(t2.etat, 'N') != 'Y'

Y'a pas ça avec MySql ?
0
Rejoignez-nous