使用 NOT IN 代替 CTE 或 temp table

Use NOT IN instead of CTE or temp table

select distinct patientID
from [dbo]..HPrecords 
where ptprocess = 'refill'
and pTDescription <> 'Success'
and patientID is not null
and patiententrytime > '2021-04-06'
and patientID not in (
    select distinct patientID
    from [dbo]..HPrecords 
    where ptprocess = 'embossing'
    and ptDescription = 'Success'
    and patientID is not null
    and patiententrytime > '2021-04-06'
)

所以我想使用 SQL 中的 NOT IN 功能来过滤掉尚未接受补充药物的患者。一个病人可以多次加注,第一次可以失败,但第二次或第三次可以成功。所以可以有多行。

所以我只想编写一个查询,该查询将过滤掉并为我提供无论多少次都无法成功重新填充的 patientID。

这样写最好吗,我现在的查询还是运行,我觉得逻辑不对?

我想尝试在没有 CTE 或 temp 的情况下编写此查询 table 作为练习。

示例输出:

PatientID
151761
151759
151757
151764

我个人更喜欢 join,而不是 not-in。看起来更整洁,阅读起来更好,并且如果您需要分析异常情况,可以访问两个 table 上的信息。我和一位同事曾经做过一些非常基本的性能比较,没有 table 差异。

这是我的看法..

select  distinct hpr.patientID
from    [dbo].HPrecords hpr
        LEFT OUTER JOIN
            [dbo].HPrecords hpr_val ON
                hpr.patientID = hpr_val.patientID
                AND hpr_val.ptprocess = 'embossing'
                AND hpr_val.ptDescription = 'Success'
                and hpr_val.patiententrytime > '20`enter code here`21-04-06'
where   hpr.ptprocess = 'refill'
and     hpr.pTDescription <> 'Success'
--and       hpr.patientID is not null  -- Not necessary because you will always have records in this table in this scenario
and     hpr.patiententrytime > '2021-04-06'
AND     hpr_Val.PatietID IS NULL

并且在架构和 table 名称之间的额外点上...正如 Smor 指出的那样,这不是必需的(甚至可能会破坏查询),而是在您不想引用时使用指向数据库和 table.

时的模式
  • 长路:[数据库].[模式].[table] -- 示例 [MyDatabase].[dbo].[MyTable]
  • 简写方式:[数据库]..[table] -- 示例[MyDatabase]..[MyTable]