Page 1 sur 2

Requête not in qui ne passe pas

Posté : 21 févr. 2006, 12:50
par SwiTz
Voila le problème

Code : Tout sélectionner

select distinct VL from client c,ca_gecaprod ca where c.ID_CLT = ca.ID_CLT not in (select distinct VL from client c , vendeur v where v.NOM_VENDEUR = v.VL)
Cette requête doit me permettre de sortir les éléments de gauche qui ne sont pas présent dans les éléments de droite (enfin si je me trompe) Mais la requête ne veut pas s'éxécuter. L'erreur retourner par phpmyadmin est de vérifier la syntaxe. Pourtant le syntaxe est bonne. Alors quel est le problème ?

Posté : 21 févr. 2006, 12:53
par zeus
Quelle est la version de MySQL ?
Les sous-requetes ne sont supportées que depuis la 4.1

Posté : 21 févr. 2006, 12:54
par mc
dans ton 2e select tu met des espaces et dans le 1er non test en jouant sur les espace.

sinon essaie en mettant comme ceci

select distinct VL from client as c, ca_gecaprod as ca where c.ID_CLT = ca.ID_CLT not in (select distinct VL from client as c, vendeur as v where v.NOM_VENDEUR = v.VL)

Posté : 21 févr. 2006, 12:58
par albat
Ce genre de requêtes ne risque-t-il pas de donner un joli produit cartésien ?... :-"
SELECT DISTINCT vl FROM client C, vendeur V WHERE V.nom_vendeur = V.vl

Posté : 21 févr. 2006, 14:18
par SwiTz
D'accord je tourne sous MySQL 4.0.21. Normalement je peut mettre à jour MySQL, il ne devrai pas avoir de pertes pour les tables ?

Posté : 21 févr. 2006, 15:11
par zeus
Je ne pense pas mais tu peux toujours faire un BAK pour parer à toute éventualité

Posté : 24 févr. 2006, 11:27
par SwiTz
Voila j'ai essayé de faire une requête NOT IN elle passe mais elle n'affiche rien la voici donc

Code : Tout sélectionner

SELECT DISTINCT RS FROM ca_gecaprod ca, CLIENT c WHERE c.ID_CLT = ca.ID_CLT AND ANNEE =2004 AND ID_MOIS =1 NOT IN ( SELECT DISTINCT RS FROM ca_gecaprod ca, CLIENT c, vendeur v WHERE c.ID_CLT = ca.ID_CLT AND v.NOM_VENDEUR = c.VL AND ANNEE =2004 AND ID_MOIS =1 )
Cette requête devrai en temps normal m'afficher le nom des entreprise qui ne sont pas pris en compte dans la sous requête. Mais hélas elle ne m'affiche rien. Or si on éxécute les deux requêtes séparement, le nombre d'entreprises renvoyés dans le résultat est différents. Pourquoi ?

Posté : 24 févr. 2006, 11:40
par Hermès
et si tu remplaces

Code : Tout sélectionner

AND ID_MOIS =1 NOT IN (
par

Code : Tout sélectionner

AND ID_MOIS =1 AND ID_MOIS NOT IN (
?

Posté : 24 févr. 2006, 11:49
par Cyrano
et pourquoi pas faire plus simplement :

Code : Tout sélectionner

SELECT DISTINCT RS FROM ca_gecaprod ca, CLIENT c, vendeur v WHERE c.ID_CLT = ca.ID_CLT AND ANNEE = 2004 AND ID_MOIS = 1 AND v.NOM_VENDEUR = c.VL AND v.NOM_VENDEUR <> c.VL;

Posté : 24 févr. 2006, 11:51
par SwiTz
Que signifie l'opérateur <> ?

Posté : 24 févr. 2006, 11:58
par Cyrano
en SQL, <> correspond à != en PHP : différent de

Posté : 24 févr. 2006, 12:26
par SwiTz
Hélas la requête que tu m'as donné ne renvoie rien :s

Posté : 24 févr. 2006, 12:33
par Cyrano
Es-tu absolument certain qu'il existe bien des résultats correpondant à ta recherche ?

Posté : 24 févr. 2006, 12:50
par SwiTz
A priori oui, pour la requête suivante

Code : Tout sélectionner

SELECT DISTINCT RS FROM ca_gecaprod ca, CLIENT c WHERE c.ID_CLT = ca.ID_CLT AND ANNEE =2004 AND ID_MOIS =1
Affichage des enregistrements 0 - 29 (10028 total, traitement: 0.3284 sec.)

Pour la suivante

Code : Tout sélectionner

SELECT DISTINCT RS FROM ca_gecaprod ca, CLIENT c, vendeur v WHERE c.ID_CLT = ca.ID_CLT AND v.NOM_VENDEUR = c.VL AND ANNEE =2004 AND ID_MOIS =1
Affichage des enregistrements 0 - 29 (9611 total, traitement: 0.0431 sec.)


Il y a une différence entre les deux, et c'est cette différence que je voudrais obtenir :'( (snif je suis nul)

Posté : 24 févr. 2006, 13:20
par Cyrano
Alors essaye ceci:

Code : Tout sélectionner

SELECT DISTINCT RS FROM ca_gecaprod ca, CLIENT c WHERE RS NOT IN (SELECT DISTINCT RS FROM ca_gecaprod ca, CLIENT c, vendeur v WHERE c.ID_CLT = ca.ID_CLT AND v.NOM_VENDEUR = c.VL AND ANNEE = 2004 AND ID_MOIS = 1) AND c.ID_CLT = ca.ID_CLT AND ANNEE = 2004 AND ID_MOIS = 1;