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


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 corro la sub-consulta sola, devuelve muy bien, por lo que estoy asumiendo que hay algún problema con la consulta principal?

Author: SteveC, 2009-12-15

4 answers

No puede devolver dos (o varias) columnas en su subconsulta para hacer la comparación en la cláusula WHERE A_ID IN (subquery) - ¿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 del otro lado de IN. Así que la consulta tiene que ser de la forma:

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

También desea agregar ordenación para que pueda seleccionar solo desde las filas superiores, pero no necesita devolver el RECUENTO como una columna para hacer su ordenación; ordenar en el la cláusula ORDER 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)
 180
Author: Chris Latta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-27 00:19:23

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
 68
Author: ShoushouLeb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-26 19:14:51

Se está quejando 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 exists. No estoy seguro de por qué quieres hacer un conteo en la misma columna dos veces, superficialmente parece redundante a lo que estás haciendo. La subconsulta aquí es solo un filtro no es lo mismo que un join. es decir, lo usa para restringir datos, no para especificar qué columnas recuperar.

 9
Author: Jim L,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-14 23:56:19

Aparte de muy buenas respuestas aquí, usted podría intentar esto también si desea utilizar su sub consulta tal cual.

Enfoque:

1) Seleccione la columna deseada (Solo 1) de su sub consulta

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 
   )
 1
Author: SVK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-23 15:52:14