È possibile specificare solo un'espressione nell'elenco di selezione quando la sottoquery non viene introdotta con EXISTS


178

La mia query è la seguente e contiene una sottoquery al suo interno:

 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)

L'errore che sto ricevendo è ...

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

Quando eseguo la query secondaria da sola, viene restituita correttamente, quindi suppongo ci sia qualche problema con la query principale?

Risposte:


231

Non puoi restituire due (o più) colonne nella tua sottoquery per fare il confronto nella WHERE A_ID IN (subquery)clausola - con quale colonna dovrebbe comparare A_ID? La tua sottoquery deve restituire solo una colonna necessaria per il confronto con la colonna sull'altro lato di IN. Quindi la query deve essere nel formato:

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

Si desidera anche aggiungere l'ordinamento in modo da poter selezionare solo dalle prime righe, ma non è necessario restituire il COUNT come colonna per eseguire l'ordinamento; l'ordinamento nella ORDERclausola è indipendente dalle colonne restituite dalla query.

Prova qualcosa del genere:

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

È necessario restituire solo una colonna e una riga nella query where in cui si assegna il valore restituito a una variabile. Esempio:

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
Non mi ha aiutato. Mi dà lo stesso errore. Specificare la colonna invece di *aiutarmi.
Mohammedsalim Shivani,

11

Si sta lamentando

COUNT(DISTINCT dNum) AS ud 

all'interno della sottoquery. Solo una colonna può essere restituita dalla sottoquery a meno che non si stia eseguendo una query esistente. Non sono sicuro del motivo per cui vuoi fare un conteggio sulla stessa colonna due volte, superficialmente sembra ridondante a quello che stai facendo. La sottoquery qui è solo un filtro, non è la stessa di un join. cioè lo usi per limitare i dati, non per specificare quali colonne recuperare.


A volte, puoi unirti ai risultati delle query e questo risolverà il problema!
JosephDoggie,

5

Oltre alle ottime risposte qui, puoi provare anche questo se vuoi usare la tua sub query così com'è.

Approccio:

1) Selezionare la colonna desiderata (solo 1) dalla query secondaria

2) Utilizzare dove mappare il nome della colonna

Codice:

 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 
   )
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.