2010-06-16 3 views
1

J'ai un problème. J'essaie de faire une requête ... Je me souviens que dans le passé j'ai fait quelque chose comme ça mais aujourd'hui cette requête ne renvoie rien, aucune erreur, aucune donnée, rien ... la requête est quelque chose comme ça:Problèmes lors de l'exécution d'une requête avec des variables dans les conditions (procédure stockée)

 

SELECT field1, @variableX:=field2 
FROM table 
WHERE 
    (SELECT COUNT(fieldA) FROM table2 WHERE [email protected] AND fieldC=0)>0 AND 
    (SELECT COUNT(fieldA) FROM table2 WHERE [email protected] AND fieldC=4)=0; 
 

J'ai aussi essayé cette requête, mais il ne fonctionne pas (aussi gaves pas d'erreur):

 

SELECT field1, @variableX:=field2, 
@variableY:=(SELECT COUNT(fieldA) FROM table2 WHERE [email protected] AND fieldC=0), 
@variableZ:=(SELECT COUNT(fieldA) FROM table2 WHERE [email protected] AND fieldC=4) 
FROM table 
WHERE @variableY>0 AND @variableZ=0; 
 

Comme vous pouvez le voir, ce que je suis en train de faire dans la 1ère requête est d'utiliser un variable dans les conditions. Dans la deuxième requête, j'essaie de créer des variables et de les évaluer dans les conditions. À la fin de la deuxième requête, la @ variableY = 1 AND @ variableZ = 0 mais je ne sais pas pourquoi la requête renvoie un ensemble de données vide.

Ce qui pourrait être mauvais ici ??? Tout commentaire ou suggestion est la bienvenue !!! Merci!!! Bye !!!

Répondre

0

IIRC, les champs sélectionnés ne sont exécutés qu'une fois qu'une clause where a été satisfaite. Ainsi, le @variableX sera toujours vide pendant toute l'exécution de la clause where ... Pour la même requête (si je comprends bien) que vous pouvez faire:

SELECT field1, field2 
FROM table AS a 
WHERE 
    (SELECT COUNT(fieldA) FROM table2 WHERE fieldB=a.field2 AND fieldC=0)>0 AND 
    (SELECT COUNT(fieldA) FROM table2 WHERE fieldB=a.field2 AND fieldC=4)=0; 
+0

merci !!!! Ça marche!!!! Je ne le savais pas mais maintenant je sais !!!! Merci mec!!! – pablomarti

2

Vous n'avez pas besoin de variables, les sous-requêtes, ou COUNT pour résoudre ce problème.

SELECT DISTINCT t1.field1, t1.field2 
FROM mytable t1 
INNER JOIN mytable2 t2 ON t1.field2 = t2.fieldB AND t3.fieldC = 0 
LEFT OUTER JOIN mytable2 t3 ON t1.field2 = t3.fieldB AND t3.fieldC = 4 
WHERE t3.fieldB IS NULL 

Vous vouliez des correspondances non nulles pour le cas t2, ce qui est vrai si la jointure interne est satisfaite.

Et vous vouliez zéro correspondance pour le cas t3, ce qui est vrai si la jointure externe est pas satisfaite (et donc t3. * Serait NULL).


@ircmaxell est exact que les expressions liste_sélection ne sont évaluées que après la ligne passe les conditions dans la clause WHERE. C'est bien, car si vous avez une expression coûteuse dans votre liste de sélection, mais que la clause WHERE va filtrer 99% des lignes, il serait inutile d'évaluer l'expression select-list coûteuse pour toutes ces lignes, seulement pour jetez-les.

+0

merci l'homme !!! C'est plus complexe !! Je ne savais pas que vous pouvez ajouter des paramètres supplémentaires lorsque vous utilisez rejoindre !! – pablomarti

Questions connexes