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

178

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

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

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

Rockit
источник

Ответы:

231

Вы не можете вернуть два (или несколько) столбца в своем подзапросе, чтобы выполнить сравнение в 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)
Крис Латта
источник
83

Вы должны вернуть только один столбец и одну строку в запросе 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
ShoushouLeb
источник
2
Это не помогло мне. Дает мне ту же ошибку. Указание столбца вместо *меня помогло.
Мохаммедсалим Шивани
11

Жалуется на

COUNT(DISTINCT dNum) AS ud 

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

Джим Л
источник
Иногда вы можете присоединиться к результатам запроса, и это решит проблему!
JosephDoggie
5

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

Подходить:

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 
   )
SVK
источник