INNER JOIN子句忽略NULL值

时间:2015-06-08 15:03:43

标签: sql-server sql-server-2008 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 
     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
-----------------------------------------------------------------------

2 个答案:

答案 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'
相关问题