web-dev-qa-db-fra.com

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

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

152
rockit

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

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

Vous souhaitez également ajouter un tri afin que vous puissiez sélectionner uniquement les lignes du haut, mais vous n'avez pas besoin de renvoyer COUNT sous forme de colonne pour pouvoir effectuer votre tri. le tri dans la clause ORDER est indépendant des colonnes renvoyées par la requête.

Essayez quelque chose comme ça:

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)
208
Chris Latta

Vous ne devez renvoyer qu'une colonne et une ligne dans la requête 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
77
ShoushouLeb

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 effectuez une requête existante. Je ne suis pas sûr de savoir pourquoi vous voulez compter deux fois sur la même colonne. En apparence, cela semble superflu par rapport à ce que vous faites. La sous-requête ici est seulement 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 et non pour spécifier les colonnes à récupérer.

10
Jim L

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

approche:

1) Sélectionnez la colonne souhaitée (1 seulement) 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 
   )
3
SVK