web-dev-qa-db-fra.com

la sous-requête renvoie plus d'une ligne

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?

10
user2066199

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.

17
bioneuralnet

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)

2
UnholyRanger