我正在进行一项简单的查询,该查询将提取诊所中所有患者的清单,这些患者要么具有某种诊断,要么已完成某项程序。诊断和程序代码是单独的字段;诊断的患者可能没有完成手术,有手术的患者可能没有诊断,但我仍然需要所有患有其中一种的患者。这是我的查询:
SELECT PatientID, PatientName, DateOfBirth
FROM Visit
WHERE VisitStatus = 'Complete'
AND (DiagnosisCode IN ('ABC','DEF','GHI') OR ProcedureCode IN ('123','456','789'))
是的,两个代码字段都有varchar数据类型,因为某些代码同时使用字母和数字。
这是WHERE
子句的简化版本,因为我实际上有超过60个诊断代码和大约30个程序代码。但我只是想确保我的语法正确。该查询绝对是永远运行的,但我不知道这是否只是因为需要筛选大量数据或者是否存在语法问题它被卡在类似于无限循环的东西中。我没有任何语法错误。我最初只有诊断代码,所以我的WHERE
条款看起来像WHERE .... AND DiagnosisCode IN ('ABC','DEF','GHI')
。它仍然需要一段时间才能运行,但最终确实有效。但是在我将OR
部分添加到程序代码后,它只是运行并运行并运行。
这看起来应该没有任何问题吗?我的语法是否正确?
答案 0 :(得分:3)
你可以通过两个查询的UNION做得更好。这可以帮助Sql Server生成更好的执行计划,更好地命中您的索引:
CREATE NONCLUSTERED INDEX MyVisitIndex1
ON Visit (VisitStatus, ProcedureCode)
INCLUDE (PatientID, PatientName, DateOfBirth);
CREATE NONCLUSTERED INDEX MyVisitIndex2
ON Visit (VisitStatus, DiagnosisCode)
INCLUDE (PatientID, PatientName, DateOfBirth);
为了获得进一步的改进,我在桌面上寻找这两个索引:
get '/services/design' => 'static_pages#design'