2017-10-09 96 views
2

我正在查询显示某些类型药物的患者。我列出了我正在寻找的几种不同的药物 - 我期待着看看数据库中是否有任何患者开具了处方药,这些药物是在今天或之后结束的。多个LIKE子句SQL

药物按名称出现在表格中,所以我试图用LIKE找到它们。但是一旦我添加了一个以上的药物,我的查询就会引起很多重复(从362行到超过32K行返回),并忽略了在药物后的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行的数据库中 - Med2在21个不同的时间规定 - 所以它完全脱离轨道)

我tr灭蝇灯子查询也:

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 

有什么建议?我已经做了一些挖掘,并没有打到任何已经工作过的东西,所以想法感谢!

回答

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,混合andor时总是使用括号。

+0

耶稣基督,你发现比光速更快 – Simon

+0

这将返回0行 - 我知道有人符合m.drugDescription,如'Med1%'(约300),并且约有400人符合'Med2%' - 当Med3进入它时,一切都变得疯狂。 – jfe042

+1

@ jfe042,戈登是对的。也许你的查询有其他错误,比如其他过滤器。我会在WHERE条款中逐行阅读,并且每次注释一个,看看哪一个导致你的悲伤。 – BJones