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?
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)
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
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.
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
)