Na liście wyboru można określić tylko jedno wyrażenie, jeśli podzapytanie nie zostało wprowadzone za pomocą EXISTS

178

Moje zapytanie jest następujące i zawiera w sobie podzapytanie:

 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)

Błąd jaki otrzymuję to ...

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

Kiedy uruchamiam samo zapytanie podrzędne, zwraca się dobrze, więc zakładam, że jest jakiś problem z głównym zapytaniem?

czadu
źródło

Odpowiedzi:

230

Nie możesz zwrócić dwóch (lub wielu) kolumn w podzapytaniu, aby wykonać porównanie w WHERE A_ID IN (subquery)klauzuli - do której kolumny ma ono się porównywać A_ID? Twoje podzapytanie musi zwracać tylko jedną kolumnę potrzebną do porównania z kolumną po drugiej stronie IN. Zatem zapytanie musi mieć postać:

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

Chcesz również dodać sortowanie, aby móc wybierać tylko z górnych wierszy, ale nie musisz zwracać LICZBA jako kolumny, aby wykonać sortowanie; sortowanie w ORDERklauzuli jest niezależne od kolumn zwracanych przez zapytanie.

Spróbuj czegoś takiego:

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)
Chris Latta
źródło
83

Powinieneś zwrócić tylko jedną kolumnę i jeden wiersz w zapytaniu where, w którym przypisujesz zwróconą wartość do zmiennej. Przykład:

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
źródło
2
To mi nie pomogło. Daje mi ten sam błąd. Określenie kolumny zamiast *pomogło mi.
Mohammedsalim Shivani
11

Narzeka

COUNT(DISTINCT dNum) AS ud 

wewnątrz podzapytania. Z podzapytania można zwrócić tylko jedną kolumnę, chyba że wykonujesz zapytanie o istnienie. Nie jestem pewien, dlaczego chcesz policzyć tę samą kolumnę dwa razy, na pozór wydaje się to zbędne w stosunku do tego, co robisz. Podzapytanie tutaj jest tylko filtrem , a nie złączeniem. tzn. używasz go do ograniczania danych, a nie do określania, które kolumny mają zostać zwrócone.

Jim L.
źródło
Czasami możesz dołączyć do wyników zapytania, a to rozwiąże problem!
JosephDoggie
5

Oprócz bardzo dobrych odpowiedzi tutaj, możesz spróbować również tego, jeśli chcesz użyć zapytania podrzędnego w takiej postaci, w jakiej jest.

Podejście:

1) Wybierz żądaną kolumnę (tylko 1) z zapytania podrzędnego

2) Użyj miejsca, aby zmapować nazwę kolumny

Kod:

 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
źródło