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')) 

Предоставляет ошибку, что подзапрос возвращает более одной строки. в чем причина?Подзапрос возвращает более 1 строки

+1

Я предполагаю, что я укажу очевидное: подзапрос возвращает более одной строки. 'disease_id' не может равняться нескольким значениям. Этот запрос будет лучше написан с помощью 'JOIN' вместо подзапросов. –

+0

http://stackoverflow.com/a/3423792/2806972 c этим может быть решение для этого Q: –

ответ

2

Сломать запрос вниз, у вас есть

Главный запрос:

select disease_name from disease where disease_id= 

Subquery 1:

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

Sub запрос 2:

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

Поскольку вы используете равные знаки, подзапросы cann ot возвращает несколько элементов. Похоже, что дополнительный запрос 2 имеет больше шансов вернуть 2 элемента из-за используемого OR. Вы можете попробовать IN, например WHERE symptom_id IN (sub-query2), с WHERE disease_id IN (sub-query1)

14

Ваши два внешних запроса структурированы так, чтобы ожидать один результат от их подзапросов. Но так, как у вас есть структурированные вещи, ваши подзапросы могут возвращать более одного результата. Если вы на самом деле хотите более одного результата, реструктурировать его так:

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

Кроме того, подзапросы это убить производительность, и это экспоненциально wosrse для вложенных подзапросов. Вместо этого вы можете посмотреть на использование INNER JOIN.

Смежные вопросы