我目前正在一个项目中,在该项目中我列出了牙科患者的名单,并且应该显示所有在个人资料上附加了两个特定程序代码的患者。这些患者必须同时具有两个程序代码,而不是一个。最初,我以为可以通过在WHERE子句中使用基本的AND语句来完成此操作,就像这样。
SELECT [stuff]
FROM [this table]
WHERE ProcedureCode = 'ABC123' AND ProcedureCode = 'DEF456';
当然,查询不会返回任何内容,因为代码是分别输入的,并且过程1和过程2不能同时存在。
出于好奇,我尝试将“ AND”切换为“ OR”。当然,对于只有一个代码或另一个代码的患者,我现在可以获得结果,但是同时具有两个代码的患者也都出现了,并且代码显示为单独的结果,例如:
Patient ID Last Name First Name Code Visit Date
1111111 Doe Jane ABC123 11-21-2015
5555555 Smith John ABC123 12-08-2015
5555555 Smith John DEF456 12-08-2015
这些天我的SQL很生锈。我正在尝试一种方法来过滤掉像简·杜(Jane Doe)这样的患者,并且仅包括像约翰·史密斯(John Smith)这样具有两种程序代码的患者。有想法吗?
根据基督徒的回答添加信息:
这是更新后的查询的样子:
SELECT PatientID, LastName, FirstName, Code, VisitDate
FROM VisitInfo
WHERE PatientID IN
(
SELECT PatientID
FROM VisitInfo
WHERE Code = 'ABC123' OR Code = 'DEF456'
GROUP BY PatientID
HAVING COUNT(*) > 1
)
AND (Code = 'ABC123' OR Code = 'DEF456');
因此,我仍然会收到类似以下的结果,其中患者仅显示一个过程代码,但可能只显示一个过程代码:
Patient ID Last Name First Name Code Visit Date
1111111 Doe Jane ABC123 11-02-2015
1111111 Doe Jane ABC123 11-21-2015
5555555 Smith John ABC123 12-08-2015
5555555 Smith John DEF456 12-08-2015
5555555 Smith John ABC123 12-14-2015
9999999 Jones Mike DEF456 11-22-2015
9999999 Jones Mike DEF456 12-06-2015
即使Jane Doe和Mike Jones有2个结果,但它们都是相同的代码,因此我们不想包含它们。即使John Smith仍然有两个相同的代码,他的结果也包括两个代码,因此我们希望保留他和其他像他这样的患者。
另一个更新:
我刚刚了解到,现在我需要为所讨论的患者提供一些基本的人口统计详细信息,因此我将VisitInfo表与PatientInfo表结合在一起。更新后的查询如下所示:
SELECT v.PatientID, v.LastName, v.FirstName, v.Code, v.VisitDate, p.DateOfBirth, p.Gender, p.PrimaryPhone
FROM VisitInfo v JOIN PatientInfo p ON v.PatientID = p.PatientID
WHERE v.PatientID IN
(
SELECT PatientID
FROM VisitInfo
WHERE Code = 'ABC123' OR Code = 'DEF456'
GROUP BY PatientID
HAVING COUNT(*) > 1
)
AND (Code = 'ABC123' OR Code = 'DEF456');
我不确定新的JOIN是否会影响任何人的答案...
有很多方法可以给这只猫咪剥皮-这是另一种方式:
WITH ABC123 AS (SELECT DISTINCT PATIENTID
FROM VISITINFO
WHERE PROCEDURECODE = 'ABC123'),
DEF456 AS (SELECT DISTINCT PATIENTID
FROM VISITINFO
WHERE PROCEDURECODE = 'DEF456')
SELECT v.PATIENTID, v.LASTNAME, v.FIRSTNAME, v.PROCEDURECODE, v.VISITDATE,
p.DateOfBirth, p.Gender, p.PrimaryPhone
FROM VISITINFO v
INNER JOIN ABC123 a
ON a.PATIENTID = v.PATIENTID
INNER JOIN DEF456 d
ON d.PATIENTID = v.PATIENTID
INNER JOIN PatientInfo p
ON v.PatientID = p.PatientID
WHERE v.PROCEDURE_CODE IN ('ABC123', 'DEF456')
ORDER BY v.PATIENTID, v.VISITDATE, v.PROCEDURECODE;
我们在这里所做的是使用几个CTE为每一个进行了相关检查的患者获取PATIENTID。然后,我们从VISITINFO中的所有记录开始,然后将两个CTE的内部记录合并在一起。因为INNER JOIN要求在连接两侧的表中都存在匹配信息,所以具有这样的效果:根据连接标准(在这种情况下为PATIENTID),仅在两个CTE中保留与该信息匹配的访问。
祝你好运。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句