我希望查询一些与患者已被处方药物治疗有关的数据。但我也想展示没有任何药物的患者。我的询问到目前为止:
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
约束,并提取所有类别。
但是,该查询不包括没有任何处方药的患者。我喜欢我的结果看起来像:
-----------------------------------------------------------------------
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
-----------------------------------------------------------------------
答案 0 :(得分: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
值未找到相关性的地方(就像在预期的输出样本中一样)。
您还可以查看最佳文章(在我看来),了解所有类型的JOIN,here。
答案 1 :(得分: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'