You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求优化排查无'-829'关联诊断的TSQL查询语句

简化你的TSQL查询方案

嘿,我看了你的查询,确实可以简化不少!核心需求是找出未关联'-829'分类的有效诊断信息,同时排除掉特定类型的procedure关联诊断,对吧?这里有个更简洁且性能更优的写法:

SELECT DISTINCT
    c2.diagnosisn AS DiagnosisName,
    a2.text AS CareLookup
FROM core_patdiagnosis c1
INNER JOIN core_diagnosis c2 ON c1.diagnosis = c2.id
INNER JOIN core_carecontext c3 ON c1.carecontex = c3.id
INNER JOIN applookup_instance a2 ON c3.lkp_context = a2.id
WHERE
    -- 筛选:诊断是活跃状态,且未关联'-829'分类(或无分类关联)
    EXISTS (
        SELECT 1
        FROM core_diagnosis_taxonomyma c5
        LEFT JOIN applookup_instance a3 ON c5.lkp_taxonomyna = a3.id
        WHERE c5.id = c2.id
        AND c2.isactive = 1
        AND (a3.id <> -829 OR a3.id IS NULL)
    )
    -- 排除:关联了'-829'分类(或无分类关联)的procedure对应的诊断
    AND NOT EXISTS (
        SELECT 1
        FROM core_procedure c12
        LEFT JOIN core_procedure_taxonomyma c22 ON c12.id = c22.id
        LEFT JOIN applookup_instance a12 ON c22.lkp_taxonomyna = a12.id
        WHERE c12.id = c2.id
        AND c12.isactive = 1
        AND (a12.id = -829 OR a12.id IS NULL)
    )
    AND c1.sys_creation_datetime > '2017-12-01 00:00:00'
    AND a2.text LIKE '%Emergency%'

优化点说明:

  • 替换IN/NOT IN为EXISTS/NOT EXISTS:
    这两个逻辑完全等价,但EXISTS的性能通常更好——数据库找到第一个匹配项就会停止检索,不像IN需要先构建完整的结果集。另外,NOT IN如果子查询返回NULL值,会导致整个条件失效(返回空结果),而NOT EXISTS不会有这个问题。
  • 移除冗余关联:
    原主查询里的a1、c5、a3在SELECT和主WHERE条件中都没用到,只在子查询里发挥作用,把它们移到对应的EXISTS子查询里,让逻辑更聚焦,也减少了主查询的连接开销。
  • 将LEFT JOIN改为INNER JOIN:
    你的WHERE条件里要求a2.text LIKE '%Emergency%',说明a2必须存在,所以c3和a2的LEFT JOIN可以改成INNER JOIN;同理,c2.id在筛选条件中必须有效,所以c1和c2的LEFT JOIN也可以改成INNER JOIN,数据库能据此做更高效的连接优化。
  • 统一日期格式:
    把'01 Dec 2017 00:00:00'改成标准的'2017-12-01 00:00:00',避免不同数据库环境下的日期解析问题。

内容的提问来源于stack exchange,提问作者Scotty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:45:18