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

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

 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.`

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

Ответы [ 4 ]

204 голосов
/ 15 декабря 2009

Вы не можете вернуть два (или несколько) столбца в своем подзапросе, чтобы выполнить сравнение в предложении 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)
76 голосов
/ 07 октября 2011

Вы должны возвращать только один столбец и одну строку в запросе 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
10 голосов
/ 15 декабря 2009

жалуется на

COUNT(DISTINCT dNum) AS ud 

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

3 голосов
/ 23 апреля 2018

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

Подход:

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 
   )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...