或者查询无效

Ada*_*ams 0 sql

我遇到了最后一个选择语句OR的问题.我们想要的是包括TIER = T1但只有COST> 500和skilllevel ='S'的记录.但是这行的最后一行只需要是一个OR.AND将遗漏大部分记录.

 Insert Into @tblMain
    Select  * from (
            SELECT distinct a.ID_KEY,a.STAT, a.TIER, f.FACILITY_ID,  f.FACILITY_NAME Name, a.RX, a.PATIENTNAME, a.MEDICATION , (a.COST) as Cost, (a.COST) as Interchanges,  s.Savings Savings
            FROM[PBM].[T_CHARGES] a 
            --Inner Join  PBM.FACILITY f on a.FACILITYNPI = f.FACILITY_NPI 
            inner Join PBM.PHARMACY_NPI pn on a.PHARMACYNPI = pn.NPI
            Inner join PBM.PHARMACY_FACILITY pp on pn.PHARMACY_ID = pp.PHARMACY_ID
            inner Join PBM.FACILITY f on pp.FACILITY_ID = f.FACILITY_ID AND a.FACILITYNPI = f.FACILITY_NPI
            Left Outer Join @TableSum s on a.ID_KEY = s.ID_KEY 
            where f.FACILITY_NAME is not null 
            and month(a.DATEDISPENSED) = @Month and year(a.DATEDISPENSED) = @Year        
            and f.FACILITY_ID = @FacilityId
            and a.STAT not in (3,4,5) 
             and (TIER <> 'T1' )
            --OR (TIER = 'T1' AND COST>500 AND SKILLLEVEL = 'S' )       
Run Code Online (Sandbox Code Playgroud)

M.A*_*Ali 5

默认情况下,sql server NOT优先于AND,AND优先于OR

   NOT --> AND --> OR 
Run Code Online (Sandbox Code Playgroud)

要执行非默认订单,您可以使用括号.

...........
and f.FACILITY_ID = @FacilityId
and a.STAT not in (3,4,5) 
and (  
          (TIER <> 'T1') 
       OR 
          (TIER = 'T1' AND COST > 500 AND SKILLLEVEL = 'S' )
    )    
Run Code Online (Sandbox Code Playgroud)


Cᴏʀ*_*ᴏʀʏ 5

SQL Server将尊重评估顺序的括号,我认为您需要:

...
AND 
(
   (TIER <> 'T1')
   OR 
   (TIER = 'T1' AND COST>500 AND SKILLLEVEL = 'S')
)
Run Code Online (Sandbox Code Playgroud)