Somente uma expressão pode ser especificada na lista de seleção quando a subconsulta não é introduzida com EXISTS

177

Minha consulta é a seguinte e contém uma subconsulta dentro dela:

 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)

O erro que estou recebendo é ...

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

Quando executo a subconsulta sozinha, ela retorna muito bem, então estou assumindo que há algum problema com a consulta principal?

rockit
fonte

Respostas:

230

Você não pode retornar duas (ou várias) colunas em sua subconsulta para fazer a comparação na WHERE A_ID IN (subquery)cláusula - com qual coluna ela deve ser comparada A_ID? Sua subconsulta deve retornar apenas uma coluna necessária para a comparação com a coluna do outro lado da IN. Portanto, a consulta precisa estar no formato:

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

Você também deseja adicionar a classificação para poder selecionar apenas nas linhas superiores, mas não precisa retornar a COUNT como uma coluna para fazer sua classificação; classificação noORDER cláusula é independente das colunas retornadas pela consulta.

Tente algo como isto:

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
fonte
83

Você deve retornar apenas uma coluna e uma linha na consulta where em que atribui o valor retornado a uma variável. Exemplo:

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
fonte
2
Isso não me ajudou. Dá-me o mesmo erro. A especificação da coluna em vez de *me ajudou.
Mohammedsalim Shivani
11

Está reclamando

COUNT(DISTINCT dNum) AS ud 

dentro da subconsulta. Somente uma coluna pode ser retornada da subconsulta, a menos que você esteja executando uma consulta existente. Não sei por que você deseja contar duas vezes a mesma coluna, superficialmente parece redundante ao que você está fazendo. A subconsulta aqui é apenas um filtro , não é o mesmo que uma associação. ou seja, você o utiliza para restringir dados, não para especificar quais colunas voltar.

Jim L
fonte
Às vezes, você pode ingressar nos resultados da consulta e isso resolverá o problema!
JosephDoggie
5

Além das respostas muito boas aqui, você pode tentar isso também se quiser usar sua subconsulta como está.

Abordagem:

1) Selecione a coluna desejada (Somente 1) na sua subconsulta

2) Use onde mapear o nome da coluna

Código:

 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
fonte