使用NOT IN代替CTE或温度表


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功能来筛选出尚未收到补充药物的患者。患者可以多次补充,第一次可能失败,但第二次或第三次可能成功。所以可以有多行。

所以我只想写一个查询,它会过滤掉,并给我一个无论多少次都没有成功补充的患者ID。

这是最好的编写方式吗?我当前的查询仍在运行,我认为逻辑错误?

作为练习,我想尝试在没有CTE或临时表的情况下编写这个查询。

样本输出:

PatientID
151761
151759
151757
151764

我个人更喜欢上面的joins而不是in。如果你需要分析异常情况,它看起来更整洁,读起来更好,并且可以访问两个表上的信息。我和一位同事曾经做过一些非常基本的绩效比较,没有明显的差异。

这是我的看法。

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

在模式和表名之间的额外点上。。。正如Smor所指出的,这是不必要的(甚至可能破坏查询(,而是在指向数据库和表时不想引用模式时使用。

  • 漫长的道路:[数据库]。[架构]。[table]--示例[MyDatabase]。[dbo]。[MyTable]
  • 捷径:[数据库]。。[table]--示例[MyDatabase]。。[MyTable]

相关内容

  • 没有找到相关文章

最新更新