나는 오늘 내가 쓴 쿼리로 작업 중이었고 WHERE
대신 IN (목록) 필터를 사용 하도록 절 에서 코드를 변경해야했습니다.
item_desc = 'item 1'
OR item_desc = 'item 2'
OR item_desc = 'item 3'
OR item_desc = 'item 4'
위의 내용은 15 분 동안 실행되었지만 아무것도 반환하지 않았지만 다음 결과는 1.5 분 안에 결과 세트를 제공했습니다.
item_desc IN (
'item 1'
,'item 2'
,'item 3'
,'item 4'
)
SQL 에서이 작업을 수행하고 왜 IN (항목 목록)이 OR 문보다 훨씬 빨리 수행되었는지 궁금합니다.
-편집-SQL Server 2008,이 정보를 처음에 넣지 않은 것에 대해 사과드립니다.
다음은 OR
명령문을 사용한 쿼리 전체입니다 .
DECLARE @SD DATETIME
DECLARE @ED DATETIME
SET @SD = '2013-06-01';
SET @ED = '2013-06-15';
-- COLUMN SELECTION
SELECT PV.PtNo_Num AS 'VISIT ID'
, PV.Med_Rec_No AS 'MRN'
, PV.vst_start_dtime AS 'ADMIT'
, PV.vst_end_dtime AS 'DISC'
, PV.Days_Stay AS 'LOS'
, PV.pt_type AS 'PT TYPE'
, PV.hosp_svc AS 'HOSP SVC'
, SO.ord_no AS 'ORDER NUMBER'
--, SO.ent_dtime AS 'ORDER ENTRY TIME'
--, DATEDIFF(HOUR,PV.vst_start_dtime,SO.ent_dtime) AS 'ADM TO ENTRY HOURS'
, SO.svc_desc AS 'ORDER DESCRIPTION'
, OSM.ord_sts AS 'ORDER STATUS'
, SOS.prcs_dtime AS 'ORDER STATUS TIME'
, DATEDIFF(DAY,PV.vst_start_dtime,SOS.prcs_dtime) AS 'ADM TO ORD STS IN DAYS'
-- DB(S) USED
FROM smsdss.BMH_PLM_PtAcct_V PV
JOIN smsmir.sr_ord SO
ON PV.PtNo_Num = SO.episode_no
JOIN smsmir.sr_ord_sts_hist SOS
ON SO.ord_no = SOS.ord_no
JOIN smsmir.ord_sts_modf_mstr OSM
ON SOS.hist_sts = OSM.ord_sts_modf_cd
-- FILTER(S)
WHERE PV.Adm_Date BETWEEN @SD AND @ED
AND SO.svc_cd = 'PCO_REMFOLEY'
OR SO.svc_cd = 'PCO_INSRTFOLEY'
OR SO.svc_cd = 'PCO_INSTFOLEY'
OR SO.svc_cd = 'PCO_URIMETER'
AND SO.ord_no NOT IN (
SELECT SO.ord_no
FRROM smsdss.BMH_PLM_PtAcct_V PV
JOIN smsmir.sr_ord SO
ON PV.PtNo_Num = SO.episode_no
JOIN smsmir.sr_ord_sts_hist SOS
ON SO.ord_no = SOS.ord_no
JOIN smsmir.ord_sts_modf_mstr OSM
ON SOS.hist_sts = OSM.ord_sts_modf_cd
WHERE OSM.ord_sts = 'DISCONTINUE'
AND SO.svc_cd = 'PCO_REMFOLEY'
OR SO.svc_cd = 'PCO_INSRTFOLEY'
OR SO.svc_cd = 'PCO_INSTFOLEY'
OR SO.svc_cd = 'PCO_URIMETER'
)
ORDER BY PV.PtNo_Num, SO.ord_no, SOS.prcs_dtime
고맙습니다,
OR
위의 실제 쿼리에서처럼, 당신은 단락에 엔진을 할 수 있습니다. WHERE A AND B OR C
C가 참이면 A AND B가 거짓이더라도 참으로 평가됩니다. WHERE A and B OR C OR D OR E OR F
당신이 위에서하는 것처럼 말하면 , 그 AND
요소는 제외 될 수 있습니다. 실제 동등한 논리는 OR
위 의 시리즈를 괄호로 묶어서 세트로 취급됩니다 WHERE A AND (B OR C OR D OR E)
. 이것이 어떻게 IN
취급 되는지 입니다.
AND
이전 OR
에 처리 된 지정된 SQL Server의 연산자 우선 순위는 위의 쿼리와 동일합니다 WHERE (OSM.ord_sts = 'DISCONTINUE' AND SO.svc_cd = 'PCO_REMFOLEY') OR SO.svc_cd = 'PCO_INSRTFOLEY' OR SO.svc_cd = 'PCO_INSTFOLEY' OR SO.svc_cd = 'PCO_URIMETER'
. 즉, 마지막 3 가지 조건 중 하나라도 해당 되는 경우 나머지 평가를 단락시킬 수 있습니다.