2015-06-08 4 views
0

Я ищу запрос некоторых данных, относящихся к лекарствам, которым был назначен пациент, которые относятся к определенной категории. Но я также хочу показать пациентам, у которых нет лекарств. Мой запрос до сих пор:Предложение INNER JOIN, игнорирующее значения NULL

SELECT 
    pd.fname, 
    pd.lname, 
    pp.drug_name, 
    pp.drug_strength 
FROM 
    patient_data pd 
    FULL OUTER JOIN patient_prescr pp on pp.pid = pd.pid 
    FULL OUTER JOIN formulary f on pp.med_id = f.id 
    INNER JOIN formulary_categories fc on f.category = fc.id AND fc.id in (34,36,37,38,5) 
WHERE 
    pd.lname = 'Test' 

При применении INNER JOIN к formulary_categories, я могу правильно определить категорию, в которой наркотик, который я хочу задать, но когда я делаю это, он не будет включать пациентов, которые не имеют какой-либо лекарства.

С INNER JOIN вступления в таблице formulary_categories, мои результаты выглядят следующим образом:

----------------------------------------------------------------------- 
fname  | lname   | drug_name    | drug_strength 
----------------------------------------------------------------------- 
Cathy   Test    Clonazepam     0.5mg 
Larry   Test    Librium     25mg 
Jennifer  Test    Vistrail     25mg 
----------------------------------------------------------------------- 

Если изменить INNER JOIN к FULL OUTER JOIN, он просто игнорирует category ограничения, так и тянет все категории.

Однако запрос не будет включать пациентов, у которых нет каких-либо назначенных лекарств. Id, как мои результаты, чтобы выглядеть примерно так:

----------------------------------------------------------------------- 
fname  | lname   | drug_name    | drug_strength 
----------------------------------------------------------------------- 
Cathy   Test    Clonazepam     0.5mg 
Larry   Test    Librium     25mg 
Joe   Test    NULL      NULL 
Jennifer  Test    Vistrail     25mg 
Steve   Test    NULL      NULL 
----------------------------------------------------------------------- 
+2

Try 'ЛЕВЫЙ JOIN' вместо' ВНУТРЕННЕЙ JOIN'. –

+2

'LEFT JOIN' вместо' INNER JOIN'? – dario

ответ

5

Вы на самом деле ищет LEFT JOIN:

SELECT 
    pd.fname, 
    pd.lname, 
    pp.drug_name, 
    pp.drug_strength 
FROM 
    patient_data pd 
    FULL OUTER JOIN patient_prescr pp on pp.pid = pd.pid 
    FULL OUTER JOIN formulary f on pp.med_id = f.id 
    LEFT JOIN formulary_categories fc on f.category = fc.id 
     AND fc.id in (34,36,37,38,5) 
WHERE 
    pd.lname = 'Test' 

LEFT JOIN не будет фильтровать данные, если корреляция не обнаружена между значениями в двух таблицах (или наборов результатов) и отобразит значение NULL для столбцов, в которых отображаются данные из таблицы, где корреляция не была найдена (как и в вашем ожидаемом образце вывода).

Вы также можете взглянуть на лучшую статью (на мой взгляд) для понимания всех типов JOINs, here.

+0

Спасибо за ответ Раду. Как вы обрабатываете 'категории', которые являются« NULL »? Я попытался применить: 'LEFT JOIN formulary_categories fc on f.category = fc.id И fc.id в (34,36,37,38,5) и fc.id IS NOT NULL', но результаты все еще остаются содержат препараты с NULL-значениями. – etm124

+0

@ etm124 Если вы хотите отфильтровать значения NULL в этом сценарии, вам нужно добавить условие 'fc.id IS NOT NULL' в конце в разделе' WHERE', например: 'WHERE pd.lname = 'Test' И fc.id не является NULL'. Выполняя проверку 'IS NOT NULL' в разделе JOIN, вы смотрите прямо в столбец' fc.id', если это 'NULL', а не в отображаемых результатах. Но я полагаю, что у вас нет значений «NULL» в столбце «ID», поэтому никакие значения не фильтруются. Возможно, вы также можете взглянуть на [**, как выполняется запрос **) (http://stackoverflow.com/a/2617679/1266737) и практиковать с объединениями LEFT и INNER –

0

Вам просто нужно LEFT OUTER JOIN:

SELECT 
    pd.fname, 
    pd.lname, 
    pp.drug_name, 
    pp.drug_strength 
FROM 
    patient_data pd 
    FULL OUTER JOIN patient_prescr pp on pp.pid = pd.pid 
    FULL OUTER JOIN formulary f on pp.med_id = f.id 
    LEFT OUTER JOIN formulary_categories fc on f.category = fc.id AND fc.id in (34,36,37,38,5) 
WHERE 
    pd.lname = 'Test' 
Смежные вопросы