2010-11-27 14 views
1

Dire que j'ai une table avec deux colonnes, X et Y. je voudrais exécuter la requête suivante par mise en veille prolongée:Filtrage sur colonnes calculées en hibernation? (AVOIR)

SELECT X*X + Y*Y AS Distance, POINTS.* from POINTS 
WHERE X > 0 
AND Y > 0 
HAVING Distance < 50 

Comment puis-je obtenir via mise en veille prolongée? Pouvez-vous fournir un échantillon de code?

Modifier - This question semble fortement liée. La seule raison pour laquelle je ne ferme pas celui-ci en double, c'est parce qu'il fournit un cas d'utilisation beaucoup plus simple (pas de GROUP BY).

+0

Cette syntaxe est invalide. HAVING sans grouper en utilisant GROUP BY n'est pas autorisé par SQL –

+0

@a_horse - Il n'est pas dans mysql. Tag ajouté En outre, vous pouvez masser ma requête dans une requête globalement valide si vous le souhaitez. – ripper234

+0

La méthode standard consiste à utiliser une table dérivée dans SELECT et à appliquer la condition WHERE pour l'alias de colonne dans le SELECT externe. –

Répondre

0

Dans la plupart des dialectes de SQL, vous ne pouvez pas utiliser le 'label d'affichage' ou le nom dans 'AS name' pour faire référence à une expression dans le corps de la requête - au grand dam des autres. Cependant, vous pouvez utiliser l'expression dans la clause WHERE.

SELECT X*X + Y*Y AS DistanceSquared, POINTS.* from POINTS 
WHERE X > 0 
    AND Y > 0 
    AND (X * X + Y * Y) < 50; 

La clause HAVING est associée à des agrégats et des comparaisons sur les granulats:

SELECT name, COUNT(*) 
    FROM SomeWhere 
GROUP BY Name 
HAVING COUNT(*) > 1; 

Les conditions dans une clause HAVING doit (doivent) comporter au moins un agrégat 'direct'; l'autre terme de la condition peut être une constante (comme indiqué) ou un autre agrégat direct, ou une sous-requête, impliquant éventuellement des agrégats «indirects». (AFAIK, j'ai inventé la terminologie «direct/indirect» pour cette réponse - vous ne serez probablement pas capable de rechercher l'expression utilement.)

Questions connexes