Только одно выражение может быть указано в списке выбора, когда подзапрос не вводится с 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
)