【发布时间】:2013-08-01 15:49:36
【问题描述】:
我有一个查询,它显示一堆关于人员的信息,以及他们是否曾经存在过一组 dxcode。每一列都是对同一张表中另一组 dxcode 的不同检查:
示例输出:
pid . . . .HTN . . .DM
123 . . . Y . . . . .N
456 . . . N . . . . .N
查询:
select
p.pid
,CASE WHEN HTN.pid is not null THEN 'Y' ELSE 'N' END AS HTN
,... (other case statements)
from p
left outer join (
SELECT dx.pid, max(create_timestamp) as maxdate
FROM pdx
WHERE pdx.dxcode IN ('401','401.0','401.1','401.9')
group by dx.pid
) as HTN on p.pid = HTN.pid
...同一个 pdx 表上的其他连接以查询其他 dx 代码是否存在
我的查询有效,但我认为它没有达到应有的效率。我真的不需要 maxdate 来做任何事情,但它确实有效。在此之前,我使用的是 select distinct person,但意识到它必须做多少后处理,并且查询性能已经大大提高。对于最佳实践,我认为使用 max 仅返回一个结果的额外计算仍然是不必要的计算。
我尝试使用exists、left join、top 1 1 和case 语句的变体来做同样的事情,但我只是没有正确执行代码。
谢谢。我知道这必须是一个简单的答案。我一直在寻找的术语没有得到我希望的答案。
【问题讨论】:
-
Nice Q - 据我所见,
max()似乎在查询计划中被忽略,因此嵌套选择与SELECT pdx.pid .. GROUP BY pdx.pid相同。我不能 100% 确定,但我想 SQL 会在发现该人的至少一个诊断后停止评估。
标签: sql-server join unique case max