Une seule expression peut être spécifiée dans la liste de sélection lorsque la sous-requête n'est pas introduite avec EXISTS

178

Ma requête est la suivante et contient une sous-requête:

 select count(distinct dNum)
 from myDB.dbo.AQ
 where A_ID in 
  (SELECT DISTINCT TOP (0.1) PERCENT A_ID, 
            COUNT(DISTINCT dNum) AS ud 
 FROM         myDB.dbo.AQ
 WHERE     M > 1 and B = 0 
 GROUP BY A_ID ORDER BY ud DESC)

L'erreur que je reçois est ...

Only one expression can be specified in the select list when the subquery is not
introduced with EXISTS.`

Lorsque j'exécute la sous-requête seule, elle renvoie très bien, donc je suppose qu'il y a un problème avec la requête principale?

rockit
la source

Réponses:

231

Vous ne pouvez pas renvoyer deux (ou plusieurs) colonnes dans votre sous-requête pour effectuer la comparaison dans la WHERE A_ID IN (subquery)clause - à quelle colonne est-elle censée comparer A_ID? Votre sous-requête ne doit renvoyer que la colonne nécessaire pour la comparaison à la colonne de l'autre côté du IN. La requête doit donc être de la forme:

SELECT * From ThisTable WHERE ThisColumn IN (SELECT ThatColumn FROM ThatTable)

Vous souhaitez également ajouter un tri afin de pouvoir sélectionner uniquement à partir des premières lignes, mais vous n'avez pas besoin de renvoyer le COUNT sous forme de colonne pour effectuer votre tri; le tri dans la ORDERclause est indépendant des colonnes renvoyées par la requête.

Essayez quelque chose comme ceci:

select count(distinct dNum) 
from myDB.dbo.AQ 
where A_ID in
    (SELECT DISTINCT TOP (0.1) PERCENT A_ID
    FROM myDB.dbo.AQ 
    WHERE M > 1 and B = 0
    GROUP BY A_ID 
    ORDER BY COUNT(DISTINCT dNum) DESC)
Chris Latta
la source
83

Vous ne devez renvoyer qu'une colonne et une ligne dans la requête where où vous affectez la valeur renvoyée à une variable. Exemple:

select * from table1 where Date in (select * from Dates) -- Wrong
select * from table1 where Date in (select Column1,Column2 from Dates) -- Wrong
select * from table1 where Date in (select Column1 from Dates) -- OK
ShoushouLeb
la source
2
Cela ne m'a pas aidé. Me donne la même erreur. Spécifier la colonne au lieu de *m'a aidé.
Mohammedsalim Shivani
11

Il se plaint de

COUNT(DISTINCT dNum) AS ud 

à l'intérieur de la sous-requête. Une seule colonne peut être renvoyée à partir de la sous-requête, sauf si vous exécutez une requête existe. Je ne sais pas pourquoi vous voulez compter deux fois sur la même colonne, superficiellement, cela semble redondant par rapport à ce que vous faites. La sous-requête ici n'est qu'un filtre, ce n'est pas la même chose qu'une jointure. c'est-à-dire que vous l'utilisez pour restreindre les données, pas pour spécifier les colonnes à récupérer.

Jim L
la source
Parfois, vous pouvez vous joindre aux résultats de la requête et cela résoudra le problème!
JosephDoggie
5

Outre de très bonnes réponses ici, vous pouvez également essayer ceci si vous souhaitez utiliser votre sous-requête telle quelle.

Approche:

1) Sélectionnez la colonne souhaitée (Seulement 1) de votre sous-requête

2) Utilisez où mapper le nom de la colonne

Code:

 SELECT count(distinct dNum)
 FROM myDB.dbo.AQ
 WHERE A_ID in 
   (
    SELECT A_ID 
    FROM (SELECT DISTINCT TOP (0.1) PERCENT A_ID, COUNT(DISTINCT dNum) AS ud 
          FROM         myDB.dbo.AQ
          WHERE     M > 1 and B = 0 
          GROUP BY A_ID ORDER BY ud DESC
         ) a 
   )
SVK
la source