jfe*_*042 2 sql t-sql sql-server
我正在进行一项询问,以显示某些类型药物的患者.我有一份我正在寻找的几种不同药物的清单 - 我正在寻找数据库中是否有任何患者的处方,这些药物在今天或之后的日期或之后结束.
药物按名称出现在表格中,所以我试图找到它们LIKE.但是,一旦我添加了多个med,我的查询就会爆出大量的重复项(从362行返回到超过32K行),并WHERE在meds之后忽略我的子句中的所有项.
所以这就是我尝试过的:
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()
Run Code Online (Sandbox Code Playgroud)
这给了我超过30K的重复 - 并且重复的患者在该WHERE条款中不符合以下标准:
where m.historyRecord = 'N'
and m.[current] = 'Y'
and m.endDate >= GETDATE()
Run Code Online (Sandbox Code Playgroud)
(而这名患者实际上只出现在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())
Run Code Online (Sandbox Code Playgroud)
这就是我要找的东西:
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
Run Code Online (Sandbox Code Playgroud)
有什么建议?我已经做了一些挖掘并且还没有完全打击任何有效的东西,所以我们非常感谢您的想法!
你需要括号!
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%'
)
Run Code Online (Sandbox Code Playgroud)
如果你正在学习SQL,混合时总是使用括号and和or.
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |