2015-12-12 6 views
0

Пусть у нас есть 2 таблицы:Помощь с SQL запроса

  1. Patients (ID, имя)
  2. Patients_Treatments (PatientID, treatment_code)

Я хотел бы запрос для получения всех пациентов который получил по крайней мере все виды лечения пациента с id='999999999'

Я пробовал много комбинаций и ничего не работал, все, что у меня есть, это пациенты, которые получили по крайней мере, один из процедур «9999999999».

+0

Вы должны изменить свой запрос и включить ваши попытки. –

ответ

2

Один метод использует автообъединение и сравнение в предложении having:

select pt2.patientId 
from patient_treatments pt join 
    patient_treatments pt2 
    on pt.treatment_code = pt2.treatment_code and pt.patientid <> pt2.patientid 
where pt.id = '999999999' 
group by pt2.patientId 
having count(pt2.treatment_code) = (select count(*) from patient_treatments pt where pt.id = '999999999'); 

Примечание: эта версия предполагает, что нет дубликатов в Patient_Treatments.

Если у вас есть дубликаты данных, вы можете использовать count(distinct):

having count(distinct pt2.treatment_code) = (select count(distinct pt.treatment_code) from patient_treatments pt where pt.id = '999999999'); 
+0

Он работает, не могли бы вы дать какое-то объяснение? –

+0

@RonenB «join» соответствует процедурам каждого пациента с лечением пациента «9999999999». Часть 'having' подсчитывает количество обработок для пациента« 9999999999 », а затем фильтрует всех пациентов, у которых одинаковое количество обработок. –

+0

@RonenB Важно: Как отмечает Гордон, это работает только в том случае, если в обработках нет дубликатов. Например, если пациент 9999999999 получил лечение А один раз, а лечение В два раза, но пациент 7 получил лечение А дважды и лечение В один раз, то у обоих есть три лечения в сумме, и у них также есть соответствующие комбинации, поэтому вы получите ** ложное совпадение **. –

0

Идея заключается в том

(1) Выберите коды обработки, принадлежащие к пациенту "999999999"

(2) Выберите только записи лечения, код лечения которых соответствует одному из кодов лечения, принадлежащих пациенту «999999999»

(3) Сгруппируйте их по пати ent_id

(4) Используйте инструкцию HAVING и COUNT (DISTINCT), чтобы выбрать только те идентификаторы пациентов, которые имеют одинаковое количество различных кодов лечения, таких как пациент «999999999».

select pt.Patient_ID,count(distinct pt.treatment_code) 
from 
Patient_treatments pt 
inner join 
(select distinct treatment_code 
from 
Patient_treatments pt 
where pt.Patient_ID="999999999" 
)t1 
on t1.treatment_code=pt.treatment_code 
where pt.Patient_ID<>"999999999" 
group by pt.Patient_ID 
having count(distinct pt.treatment_code)= 
(select count(distinct treatment_code) 
    from 
    Patient_treatments pt 
    where pt.Patient_ID="999999999" 
); 

С следующей схеме, только пациент 1 выбран: -

Create table Patient_Treatments 
    (
    Patient_ID varchar(10), 
    Treatment_code varchar(10) 
    ); 


    Insert into Patient_Treatments 
    values 
    ("1","abc"), 
    ("1","def"), 
    ("1","def"), 
    ("1","ghi"), 
    ("2","abc"), 
    ("2","def"), 
    ("2","def"), 
    ("3","ghi"), 
    ("999999999","abc"), 
    ("999999999","def"), 
    ("999999999","ghi"), 
    ("999999999","ghi") 

http://sqlfiddle.com/#!9/03a84b

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