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'))
Donne une erreur indiquant que la sous-requête renvoie plus d'une ligne. quelle est la cause?
Vos deux requêtes externes sont structurées de manière à attendre un seul résultat de leurs sous-requêtes. Mais la façon dont vous avez structuré les choses, vos sous-requêtes peuvent renvoyer plus d'un résultat. Si vous voulez plus d'un résultat, restructurez-le comme ceci:
... where disease_id IN (subquery returning multiple rows...)
En outre, les sous-requêtes réduisent les performances et sont exponentiellement plus mauvaises pour les sous-requêtes imbriquées. Vous pouvez envisager d'utiliser INNER JOIN
au lieu.
En décomposant votre requête, vous avez
Requête principale:
select disease_name from disease where disease_id=
Sous-requête 1:
select disease_id from disease_symptom where
disease.disease_id=disease_symptom.disease_id AND
symptom_id=
Sous-requête 2:
select symptom_id from symptom where symptom.symptom_id=disease_symptom.symptom_id
AND symptom_name='fever' OR symptom_name='head ache'
Puisque vous utilisez des signes égaux, les sous-requêtes ne peuvent pas renvoyer plusieurs éléments. Il semble que la sous-requête 2 ait plus de chances de renvoyer 2 éléments en raison de l'utilisation de OR
. Vous pouvez essayer la clause IN
telle que WHERE symptom_id IN (sub-query2)
avec WHERE disease_id IN (sub-query1)