2013-02-12 4 views
8
select 
    disease_name 
from 
    disease 
where 
    disease_id= 
    (select disease_id from disease_symptom where 
     disease.disease_id=disease_symptom.disease_id AND 
     symptom_id= 
       (select symptom_id from symptom where symptom.symptom_id=disease_symptom.symptom_id 
       AND symptom_name='fever' OR symptom_name='head ache')) 

Fornisce un errore che la sottoquery restituisce più di una riga. Qual è la causa?subquery restituisce più di 1 riga

+1

Immagino che sarò io a dichiarare l'ovvio: la sottoquery restituisce più di una riga. 'disease_id' non può essere uguale a più valori. Questa query sarebbe meglio scritta con 'JOIN's anziché sottoquery. –

+0

http://stackoverflow.com/a/3423792/2806972 c questa può essere la soluzione per questo Q: –

risposta

2

Rompere la query verso il basso, si ha

query principale:

select disease_name from disease where disease_id= 

sottoquery 1:

select disease_id from disease_symptom where 
     disease.disease_id=disease_symptom.disease_id AND 
     symptom_id= 

Sub interrogazione 2:

select symptom_id from symptom where symptom.symptom_id=disease_symptom.symptom_id 
      AND symptom_name='fever' OR symptom_name='head ache' 

Dal momento che si sta utilizzando segni uguali, le subquery cann o restituire più oggetti. Sembra che la query secondaria 2 abbia maggiori possibilità di restituire 2 elementi a causa del fatto che viene utilizzato lo OR. Potresti provare la clausola IN come WHERE symptom_id IN (sub-query2) con WHERE disease_id IN (sub-query1)

14

Le tue due query esterne sono strutturate in modo da aspettarsi un singolo risultato dalle loro sottoquery. Ma nel modo in cui hai le cose strutturate, le subquery potrebbero restituire più di un risultato. Se effettivamente desidera più di un risultato, la ristrutturazione in questo modo:

... where disease_id IN (subquery returning multiple rows...) 

Inoltre, subqueries è uccidere le prestazioni, ed è in modo esponenziale wosrse per subquery nidificate. Si potrebbe voler esaminare utilizzando INNER JOIN invece.