2009-08-29 9 views
2

J'écris une sous-requête select qui renvoie un COUNT. Cependant, j'ai besoin d'utiliser une clause HAVING dans la sous-requête et, par conséquent, j'ai besoin de spécifier cette colonne dans ma sous-requête SELECT. Donc le résultat est que j'ai 2 colonnes: COUNT et column_for_having_clause.Sous-requête renvoyant plusieurs colonnes

Y at-il un moyen que je peux dire à SQL de prendre seulement la première colonne. J'obtiens une erreur en disant "L'opérande doit contenir 1 colonne (s)". Je me dis que cela doit être un problème commun, est-ce que quelqu'un connaît un moyen de le contourner?

De même, existe-t-il un moyen d'exécuter une clause HAVING sans spécifier la colonne dans votre requête SELECT?

Merci!

+0

Cela peut être plus facile de répondre avec un ensemble de données spécifique et ce que vous voulez retourner. – cletus

Répondre

1

Vous pouvez faire

SELECT blah FROM foo WHERE bar = (SELECT cnt FROM (SELECT cnt, column_for_having_clause FROM table .... HAVING ... LIMIT 1)) 

cependant assez laid.

1

Bien sûr, vous pouvez spécifier pratiquement n'importe quelle expression que vous voulez dans la clause HAVING. Il ne doit pas être une colonne de la liste de sélection.

SELECT ... 
FROM foo 
WHERE x = (SELECT COUNT(*) FROM bar 
      GROUP BY y HAVING y = MAX(y)); 

Mais vous pouvez également, si vous comparez le nombre à quelque chose dans la requête externe, comparer les tuples.

SELECT ... 
FROM foo 
WHERE (x, 1) = (SELECT COUNT(*), y = MAX(y) AS is_max FROM bar 
       GROUP BY y HAVING is_max = 1); 
+0

Merci beaucoup pour la réponse ... mais j'obtiens des erreurs de "colonnes inconnues" chaque fois que j'ajoute une colonne dans la clause having que je n'avais pas dans la sélection Pourquoi cela serait-il? –

+2

Il serait utile si vous éditez votre question et montrez la requête SQL. –

Questions connexes