etm*_*124 0 sql-server join sql-server-2008
我希望查询一些与某个类别的患者已被处方的药物有关的数据.但我也想展示没有任何药物的患者.我的查询到目前为止:
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'
Run Code Online (Sandbox Code Playgroud)
当应用INNER JOINto时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
-----------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
如果我将其更改INNER JOIN为a 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
-----------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
你其实是在寻找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'
Run Code Online (Sandbox Code Playgroud)
LEFT JOIN如果在两个表(或结果集)中的值之间未找到相关性,A 将不会过滤数据,并且将显示显示NULL未找到相关性的表中数据的列的值(就像在预期输出中一样)样品).
您还可以在此处查看最佳文章(在我看来),以了解所有类型的JOIN .