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

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.`

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

131
demandé sur SteveC 2009-12-15 02:39:14

4 réponses

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

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

Vous voulez également ajouter un tri afin que vous puissiez sélectionner uniquement à partir des lignes supérieures, mais vous n'avez pas besoin de retourner le compte en tant que colonne pour faire votre tri; tri dans le La clause ORDER est indépendante 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)
180
répondu Chris Latta 2015-08-27 00:19:23

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
68
répondu ShoushouLeb 2015-06-26 19:14:51

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 exists. Je ne sais pas pourquoi vous voulez faire un compte sur la même colonne deux fois, superficiellement il semble redondant à ce que vous faites. La sous-requête ici n'est qu'un filter 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.

9
répondu Jim L 2009-12-14 23:56:19

En dehors de très bonnes réponses ici, vous pouvez essayer cela aussi si vous voulez utiliser votre sous-requête telle quelle.

Approche:

1) Sélectionnez la colonne souhaitée (seulement 1) dans 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 
   )
1
répondu SVK 2018-04-23 15:52:14