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]