SQL查询:在WHERE子句中使用AND / OR

联合会

我目前正在一个项目中,在该项目中我列出了牙科患者的名单,并且应该显示所有在个人资料上附加了两个特定程序代码的患者。这些患者必须同时具有两个程序代码,而不是一个。最初,我以为可以通过在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是否会影响任何人的答案...

Bob Jarvis-恢复莫妮卡

有很多方法可以给这只猫咪剥皮-这是另一种方式:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档