Solo se puede especificar una expresión en la lista de selección cuando la subconsulta no se introduce con EXISTS

178

Mi consulta es la siguiente, y contiene una subconsulta dentro de ella:

 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)

El error que estoy recibiendo es ...

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

Cuando ejecuto la subconsulta sola, devuelve muy bien, ¿así que supongo que hay algún problema con la consulta principal?

rockit
fuente

Respuestas:

230

No puede devolver dos (o múltiples) columnas en su subconsulta para hacer la comparación en la WHERE A_ID IN (subquery)cláusula: ¿con qué columna se supone que debe comparar A_ID? Su subconsulta solo debe devolver la columna necesaria para la comparación con la columna en el otro lado del IN. Por lo tanto, la consulta debe tener la forma:

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

También desea agregar la ordenación para poder seleccionar solo desde las filas superiores, pero no necesita devolver COUNT como una columna para hacer su ordenación; La ordenación en la ORDERcláusula es independiente de las columnas devueltas por la consulta.

Intenta algo como esto:

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

Debe devolver solo una columna y una fila en la consulta where donde asigna el valor devuelto a una variable. Ejemplo:

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
fuente
2
No me ha ayudado. Me da el mismo error. Especificar la columna en lugar de *ayudarme.
Mohammedsalim Shivani
11

Se queja de

COUNT(DISTINCT dNum) AS ud 

dentro de la subconsulta. Solo se puede devolver una columna de la subconsulta a menos que esté realizando una consulta existente. No estoy seguro de por qué quieres contar dos veces en la misma columna, superficialmente parece redundante lo que estás haciendo. La subconsulta aquí es solo un filtro, no es lo mismo que una combinación. es decir, lo usa para restringir datos, no para especificar qué columnas recuperar.

Jim L
fuente
¡A veces, puede unirse contra los resultados de la consulta y eso resolverá el problema!
JosephDoggie
5

Además de las muy buenas respuestas aquí, puede probar esto también si desea utilizar su subconsulta tal como está.

Acercarse:

1) Seleccione la columna deseada (Solo 1) de su subconsulta

2) Use dónde asignar el nombre de la columna

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
fuente