带 AND/OR 的 WHERE 子句的语法?

Syntax for WHERE clause with AND/OR?

我正在处理一个简单的查询,该查询将提取诊所中具有特定诊断或已完成特定程序的所有患者的列表。诊断和程序代码是单独的字段;有诊断的病人可能没有做过手术,做过手术的病人可能没有诊断,但我仍然需要所有做过这两种手术的病人。这是我得到的查询:

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 部分之后,它只是 运行ning 和 运行ning 和 运行ning。

这看起来应该 运行ning 没有任何问题吗?我的语法正确吗?

将两个查询联合起来可能会好一些。这可以帮助 Sql 服务器生成更好的执行计划,更好地命中您的索引:

SELECT PatientID, PatientName, DateOfBirth
FROM Visit
WHERE VisitStatus = 'Complete'
    AND DiagnosisCode IN ('ABC','DEF','GHI')

UNION

SELECT PatientID, PatientName, DateOfBirth
FROM Visit
WHERE VisitStatus = 'Complete'
    AND ProcedureCode IN ('123','456','789')

为了获得进一步的改进,我会在 table:

上寻找这两个索引
CREATE NONCLUSTERED INDEX MyVisitIndex1
ON Visit (VisitStatus, ProcedureCode)
INCLUDE (PatientID, PatientName, DateOfBirth);
CREATE NONCLUSTERED INDEX MyVisitIndex2
ON Visit (VisitStatus, DiagnosisCode)
INCLUDE (PatientID, PatientName, DateOfBirth);