使用 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]
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]