sql-server - INNER JOIN 子句忽略 NULL 值

标签 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 加入公式类别表,我的结果如下所示:

-----------------------------------------------------------------------
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
-----------------------------------------------------------------------

最佳答案

您实际上是在寻找 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 .

关于sql-server - INNER JOIN 子句忽略 NULL 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30712682/

相关文章:

sql - <表值函数> 不是可识别的内置函数名称

sql - 当插入事件发生时,我可以将列值更新到触发器中吗?

c# - 返回受 SQL UPDATE 语句影响的行

JOIN性能不佳的mysql子查询

sql-server - 使用格式文件(固定宽度)批量插入 - 遇到意外的文件结尾

sql-server - 在同一硬件/物理服务器上运行的应用程序服务器和 Web 服务器

sql-server - 何时开始担心数据库表中的行

mysql - 避免多个内部联接从同一个表添加新列(信息)

sql - 不支持 LEFT JOIN SQL 连接表达式

c# - EF core 2.1 中具有 lambda 表达式的最大 n 个组