INNER JOIN子句忽略NULL值

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)

Rad*_*hiu 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'
Run Code Online (Sandbox Code Playgroud)

LEFT JOIN如果在两个表(或结果集)中的值之间未找到相关性,A 将不会过滤数据,并且将显示显示NULL未找到相关性的表中数据的列的值(就像在预期输出中一样)样品).

您还可以在此处查看最佳文章(在我看来),以了解所有类型的JOIN .