Только одно выражение может быть указано в списке выбора, когда подзапрос не вводится с EXISTS

Мой запрос выглядит следующим образом и содержит внутри него подзапрос:

 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)

Ошибка, которую я получаю,...

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

Когда я запускаю подзапрос в одиночку, он возвращается просто отлично, поэтому я предполагаю, что есть некоторая проблема с основным запросом?

Ответ 1

Вы не можете вернуть два (или несколько) столбцов в свой подзапрос, чтобы выполнить сравнение в предложении WHERE A_ID IN (subquery) - в каком столбце он должен сравнивать A_ID с? Ваш подзапрос должен возвращать только один столбец, необходимый для сравнения, с столбцом на другой стороне IN. Поэтому запрос должен иметь вид:

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

Вы также хотите добавить сортировку, чтобы вы могли выбрать только верхние строки, но вам не нужно возвращать COUNT в качестве столбца, чтобы сделать ваш вид; сортировка в предложении ORDER не зависит от столбцов, возвращаемых запросом.

Попробуйте что-то вроде этого:

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)

Ответ 2

Вы должны вернуть только один столбец и одну строку в запрос where, где вы присваиваете возвращаемое значение переменной. Пример:

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

Ответ 3

Он жалуется на

COUNT(DISTINCT dNum) AS ud 

внутри подзапроса. Только один столбец может быть возвращен из подзапроса, если вы не выполняете существующий запрос. Я не уверен, почему вы хотите сделать счет в одном столбце дважды, внешне он выглядит излишним для того, что вы делаете. Подзапрос здесь - это только фильтр, который не совпадает с соединением. т.е. вы используете его для ограничения данных, а не для указания, какие столбцы возвращаются.

Ответ 4

Помимо очень хороших ответов, вы также можете попробовать это, если хотите использовать подзапрос как есть.

Подход:

1) Выберите нужный столбец (только 1) из вашего подзапроса

2) Используйте, где сопоставить имя столбца

Код:

 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 
   )