Соединения и вложенные запросы — несколько таблиц (4+)

RDMBS: вложенный запрос Oracle является обязательным требованием.

Я пытаюсь собрать всех пациентов, которые были на приеме в марте 2014 года, а также показать, к какому врачу они обращались, и какой у них был диагноз. Затем отобразите идентификатор назначения, полное имя пациента, возраст, пол и телефон, а также отобразите полное имя и телефон врача. Я могу сделать большую часть этого, пока я не спрошу, какой диагноз был поставлен пациенту.

Этот код позволяет мне получить доступ к записям пациентов и врачей за март 2014 года:

Select Appointment.appointmentid, patient.surname ||','|| patient.given as     Patient, trunc(((sysdate-patient.dob)/365),0) as Patient_Age, patient.phonehome as Patient_Contact, doctor.Surname ||','|| doctor.given as Doctor, doctor.phone as Doctor_Contact
from doctor, patient, appointment 
where doctor.doctorid=appointment.doctorid
and patient.patientid=appointment.patientid
and extract(month from dateofappointment) = '03'
and extract(year from dateofappointment) = '2014';

Но как только я помещаю вложенный запрос на диагностику, я получаю ошибки.

код:

Select Appointment.appointmentid, patient.surname ||','|| patient.given as Patient, trunc(((sysdate-patient.dob)/365),0) as Patient_Age, patient.phonehome as Patient_Contact, disease.name as Diagnosis, doctor.Surname ||','|| doctor.given as Doctor, doctor.phone as Doctor_Contact
from doctor, patient, appointment 
where disease.name in (select disease.name
from disease
where disease.diseaseid=diagnosed.diseaseid
and diagnosed.appointmentid=appointment.appointmentid)
and doctor.doctorid=appointment.doctorid
and patient.patientid=appointment.patientid
and extract(month from dateofappointment) = '03'
and extract(year from dateofappointment) = '2014';

Любые исправления или советы будут оценены.


person Shandep    schedule 29.04.2015    source источник
comment
Какая у вас ошибка?   -  person Mahmoud Gamal    schedule 29.04.2015
comment
ОШИБКА в строке 3: ORA-00904: DISEASE.NAME: неверный идентификатор   -  person Shandep    schedule 29.04.2015


Ответы (1)


Вы не ссылались на таблицу disease. Вы можете переписать запрос следующим образом:

Select 
  Appointment.appointmentid, 
  patient.surname ||','|| patient.given as Patient, 
  trunc(((sysdate-patient.dob)/365),0) as Patient_Age, 
  patient.phonehome as Patient_Contact, 
  disease.name as Diagnosis, 
  doctor.Surname ||','|| doctor.given as Doctor, 
  doctor.phone as Doctor_Contact
from doctor
inner join appointment on doctor.doctorid         = appointment.doctorid
inner join patient     on patient.patientid       = appointment.patientid
inner join diagonsed   on diagnosed.appointmentid = appointment.appointmentid
inner join disease     on disease.diseaseid       = diagnosed.diseaseid
where extract(month from dateofappointment) = '03'
  and extract(year from dateofappointment) = '2014';

Или, используя тот же вложенный запрос, можно переписать его так:

Select 
  Appointment.appointmentid, 
  patient.surname ||','|| patient.given as Patient, 
  trunc(((sysdate-patient.dob)/365),0) as Patient_Age, 
  patient.phonehome as Patient_Contact, 
  disease.name as Diagnosis, 
  doctor.Surname ||','|| doctor.given as Doctor, 
  doctor.phone as Doctor_Contact
from doctor, appointment, patient, diagnosed, disease
where doctor.doctorid = appointment.doctorid
and appointment.patientid = patient.patientid
and diagnosed.appointmentid=appointment.appointmentid
and disease.diseaseid=diagnosed.diseaseid
and disease.name in (select disease.name
                       from disease
                       where disease.diseaseid=diagnosed.diseaseid)
and extract(month from dateofappointment) = '03'
and extract(year from dateofappointment) = '2014';
person Mahmoud Gamal    schedule 29.04.2015
comment
Есть ли способ написать это с помощью вложенного запроса? - person Shandep; 29.04.2015
comment
Я только что проверил его, и он говорит, что в строке 5 есть ошибка, и что диагност.appointmentid является недопустимым идентификатором. - person Shandep; 29.04.2015
comment
@Shandep - в вашей диагностированной таблице есть столбец appointmentid или нет ?? - person Mahmoud Gamal; 29.04.2015
comment
это так - я исправил проблему. - person Shandep; 29.04.2015