我正在进行一项查询,以显示某些类型药物的患者。我列出了一些我正在寻找的不同药物的清单 - 我想看看数据库中是否有任何患者在今天或之后结束任何这些药物的处方&# 39;约会。
药物按名称显示在表格中,因此我尝试使用LIKE
找到它们。但是,一旦我添加了多个med,我的查询就会爆发大量重复项(从362行返回到超过32K行),并忽略meds后WHERE
子句中的所有项。
所以这就是我尝试过的事情:
select p.PatientID,
p.FirstName+' '+p.LastName as 'PatientName',
m.endDate,
m.Prescriber,
m.drugDescription as 'DrugName'
from Medications m
join Patients p on p.RCDID = m.PTID
where m.historyRecord = 'N'
and m.[current] = 'Y'
and m.drugDescription like 'Med1%'
or m.drugDescription like 'Med2%'
or m.drugDescription like 'Med3%'
and m.endDate >= GETDATE()
这给了我超过30K的重复 - 并且重复的患者在WHERE
条款中不符合以下标准:
where m.historyRecord = 'N'
and m.[current] = 'Y'
and m.endDate >= GETDATE()
(而且这名患者实际上只出现在21行的数据库中 - 在21次不同的时间内开出Med2 - 所以它完全脱离了轨道)
我也尝试了一个子查询:
select p.PatientID,
p.FirstName+' '+p.LastName as 'PatientName',
m.endDate,
m.Prescriber,
m.drugDescription as 'DrugName'
from Medications m
join Patients p on p.RCDID = m.PTID
where m.historyRecord = 'N'
and m.[current] = 'Y'
and exists (select 1 from Medications m1
where m1.PTID = m.PTID
and m1.drugDescription like 'Med1%'
or m1.drugDescription like 'Med2%'
or m1.drugDescription like 'Med3%'
and m1.endDate >= GETDATE())
这就是我正在寻找的:
PatientID | PatientName | endDate | Prescriber | DrugName
1 | John Smith | 2017-10-22| Dr. Jones | Med1
1 | John Smith | 2017-10-22| Dr. Jones | Med3
2 | Mary Doe | 2017-11-01| Dr. Johnson| Med2
3 | Steve Doe | 2017-11-15| Dr. Smith | Med1
有什么建议吗?我已经完成了一些挖掘工作,并且已经完成了任何有效的工作,所以我们非常感谢您的想法!
答案 0 :(得分:5)
你需要括号!
where m.historyRecord = 'N' and
m.[current] = 'Y' and
m.endDate >= GETDATE() and
(m.drugDescription like 'Med1%' or
m.drugDescription like 'Med2%' or
m.drugDescription like 'Med3%'
)
如果您正在学习SQL,请在混合使用and
和or
时使用括号。