У списку вибору може бути вказаний лише один вираз, коли підзапит не вводиться з 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.`

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

Відповіді:


230

Ви не можете повернути два (або кілька) стовпців у своєму підзапиті, щоб зробити порівняння в 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

Ви повинні повернути лише один стовпець і один рядок у запиті, де ви присвоюєте повернене значення змінній. Приклад:

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

2
Це мені не допомогло. Надає мені таку ж помилку. Вказання стовпця замість *мене допомогло.
Мухаммедсалім Шивані

11

Це скарги на

COUNT(DISTINCT dNum) AS ud 

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


Іноді ви можете приєднатись до результатів запитів, і це вирішить проблему!
ДжозефДоггі

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 
   )
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.