3

古いバージョンではなく標準の結合 (from 句) を使用するようにクエリを作り直そうとしています (SQL サーバーに移行するため、この変換を行う必要があります)。私が直面している問題は、以下の私のバージョンのクエリが元のクエリよりもはるかに少ないレコードを返すことです。だから私は私の外部結合の1つがそれほど外側ではないと考えています。特にクエリ全体を実際に実行した場合は、ご協力いただきありがとうございます。このような移行を行う方法に関する適切なドキュメントが見つからないようです。

declare
@startdate datetime, @enddate datetime

select @startdate = dateadd(dd,-6,convert(datetime,convert(varchar,getdate(),101))) 
select @enddate = dateadd(dd,6,@startdate) 

SELECT PAT.CUSID as ID , 
       substring(CPTREC.CompletedDateTime,1,12) AS DateOfService, 
       SUBSTRING(PCMH.ProcedureCode,CHARINDEX('-',PCMH.ProcedureCode)+ 1,50) AS CPT_Code 
FROM cpt_records as CPTREC
left Outer Join ProcedureCodeMH as PCMH 
    on CPTREC.ProcedureCodeRevCount = PCMH.ProcedureCodeRevCount 
        and CPTREC.ProcedureCodeSer= PCMH.ProcedureCodeSer
left outer join Credit as CR 
    on CPTREC.ActInstProcCodeSer = CR.ActInstProcCodeSer 
        and CPTREC.ActInstProcCodeRevCount = CR.ActInstProcCodeRevCount
inner join ActivityInstance as ACTIN 
    on CPTREC.ActivityInstanceSer= ACTIN.ActivityInstanceSer 
        and CPTREC.ActivityInstanceRevCount = ACTIN.ActivityInstanceRevCount
inner join ActivityCapture as ACTCAP 
    on ACTCAP.ActivityInstanceSer= ACTIN.ActivityInstanceSer 
        and ACTCAP.ActivityInstanceRevCount = ACTIN.ActivityInstanceRevCount
inner join ActCaptDiagnosisMH as ACTCAPDMH 
    on ACTCAPDMH.ActivityCaptureSer = ACTCAP.ActivityCaptureSer 
        and ACTCAPDMH.ActivityCaptureRevCount=ACTCAP.ActivityCaptureRevCount
left outer join Department as DEPT 
    on ACTCAP.DepartmentSer = DEPT.DepartmentSer
left outer join Hospitality as HOSP 
    on DEPT.HospitalitySer = HOSP.HospitalitySer
Left outer join Diagnosis as DIAG 
    on ACTCAPDMH.DiagnosisSer = DIAG.DiagnosisSer
inner join TemplateCycle as TEMPCYC 
    on ACTIN.TemplateCycleSer= TEMPCYC.TemplateCycleSer
inner join Template as PLATE 
    on TEMPCYC.TemplateSer = PLATE.TemplateSer
inner join Patent as PAT 
    on PLATE.PatentSer = PAT.PatentSer
Left Outer Join PatentParticular as PATPAR 
    on PAT.PatentSer = PATPAR.PatentSer
inner join PatentDoctor as PATDOC 
    on PAT.PatentSer = PATDOC.PatentSer
inner join Doctor as DOC 
    on PATDOC.ResourceSer = DOC.ResourceSer
WHERE ( CPTREC.CompletedDateTime >= @startdate ) 
    and ( CPTREC.CompletedDateTime < dateadd(dd,1,@enddate) ) 
    and ( CPTREC.ObjectStatus = 'Active' ) 
    and ( PATDOC.OncologistFlag = 0 ) 
    and ( PATDOC.PrimaryFlag = 1 ) 
    and ( PCMH.ProcedureCode like '%77781%' 
            or PCMH.ProcedureCode like '%77782%' 
            or PCMH.ProcedureCode like '%77783%' 
            or PCMH.ProcedureCode like '%77784%' 
            or PCMH.ProcedureCode like '%77785%' 
            or PCMH.ProcedureCode like '%77786%' 
            or PCMH.ProcedureCode like '%77787%')

より多くのレコードを復活させるオリジナルは


SELECT PAT.CUSID as ID , substring(cpt_records.CompletedDateTime,1,12) AS DateOfService, SUBSTRING(ProcedureCodeMH.ProcedureCode,CHARINDEX('-',ProcedureCodeMH.ProcedureCode)+ 1,50) AS CPT_Code INTO cpt777 FROM cpt_records , ActivityCapture , ActivityInstance , Patent as PAT, ProcedureCodeMH , Template , TemplateCycle , Department , Hospitalityity , Credit , Doctor, PatentDoctor , ActCaptDiagnosisMH , Diagnosis , PatentParticular WHERE ( #cpt_records.ProcedureCodeSer *= ProcedureCodeMH.ProcedureCodeSer) and

( ProcedureCodeMH.ProcedureCodeRevCount =*cpt_records.ProcedureCodeRevCount) and

( ActivityCapture.DepartmentSer *= Department.DepartmentSer) and

( Department.HospitalitySer *= Hospitality.HospitalitySer) and

( ActivityCapture.ActivityCaptureSer *= Credit.ActivityCaptureSer) and

( ActivityCapture.ActivityCaptureRevCount *= Credit.ActivityCaptureRevCount) and

( Credit.ActInstProcCodeSer =* cpt_records.ActInstProcCodeSer) and

( Credit.ActInstProcCodeRevCount =* cpt_records.ActInstProcCodeRevCount) and

( Patent.PatentSer *= PatentParticular.PatentSer) and

( cpt_records.ActivityInstanceSer = ActivityInstance.ActivityInstanceSer ) and

(cpt_records.ActivityInstanceRevCount = ActivityInstance.ActivityInstanceRevCount ) and

( ActivityInstance.ActivityInstanceSer = ActivityCapture.ActivityInstanceSer ) and

( ActivityInstance.ActivityInstanceRevCount = ActivityCapture.ActivityInstanceRevCount ) and

( Patent.PatentSer = Template.PatentSer ) and

( Template.TemplateSer = TemplateCycle.TemplateSer ) and

( TemplateCycle.TemplateCycleSer = ActivityInstance.TemplateCycleSer ) and

( Patent.PatentSer = PatentDoctor.PatentSer ) and

( PatentDoctor.ResourceSer = Doctor.ResourceSer ) and

( ActivityCapture.ActivityCaptureSer = ActCaptDiagnosisMH.ActivityCaptureSer ) and

( ActivityCapture.ActivityCaptureRevCount = ActCaptDiagnosisMH.ActivityCaptureRevCount ) and (cpt_records.CompletedDateTime >= @startdate ) and

( cpt_records.CompletedDateTime < dateadd(dd,1,@enddate) ) and

( cpt_records.ObjectStatus = 'Active' ) and

( PatentDoctor.OncologistFlag = 0 ) and

( PatentDoctor.PrimaryFlag = 1 ) and

( ActCaptDiagnosisMH.DiagnosisSer *= Diagnosis.DiagnosisSer) and

( ProcedureCodeMH.ProcedureCode like '%77781%' or ProcedureCodeMH.ProcedureCode like '%77782%' or ProcedureCodeMH.ProcedureCode like '%77783%' or ProcedureCodeMH.ProcedureCode like '%77784%' or ProcedureCodeMH.ProcedureCode like '%77785%' or ProcedureCodeMH.ProcedureCode like '%77786%' or ProcedureCodeMH.ProcedureCode like '%77787%')
4

1 に答える 1

0

問題は、一致する行が見つからない結合された列の値に対して左結合がnullを返すことですが、where句でそれらの列の値をチェックしていますが、where述語はすべての行が結合された後に実行されるため、決して一致すると、外部結合が沈みます。

つまり、このクエリの例:

select *
from table1 t1
left join table2 t2 on t2.fk = t1.id
where t2.col1 = 'x'

はに対応する行を持たない行を返すことありません。table2col1nullnullfalsecol1 is null

これを修正するには、テストを句に移動する必要があるため、次のように、結合が行われている間にON比較が行われます。

select *
from table1 t1
left join table2 t2 on t2.fk = t1.id and t2.col1 = 'x'

現在、左結合は、キーの照合中に行を返し、追加の述語を適用して一致をさらに絞り込みます。


あなたの場合、 への外部(つまりleft)結合を行っていますが、上記の最初の例と同様に、句内ProcedureCodeMH as PCMHの列をテストしています。PCMHWHERE

クエリの書き換えは次のようになります (変更箇所については、インライン コメントを参照してください)。

SELECT PAT.CUSID as ID , 
       substring(CPTREC.CompletedDateTime,1,12) AS DateOfService, 
       SUBSTRING(PCMH.ProcedureCode,CHARINDEX('-',PCMH.ProcedureCode)+ 1,50) AS CPT_Code 
FROM cpt_records as CPTREC
left Outer Join ProcedureCodeMH as PCMH 
    on CPTREC.ProcedureCodeRevCount = PCMH.ProcedureCodeRevCount 
        and CPTREC.ProcedureCodeSer= PCMH.ProcedureCodeSer
        -- MOVED THIS TEST FROM WHERE CLAUSE TO HERE
        and ( PCMH.ProcedureCode like '%77781%' 
                or PCMH.ProcedureCode like '%77782%' 
                or PCMH.ProcedureCode like '%77783%' 
                or PCMH.ProcedureCode like '%77784%' 
                or PCMH.ProcedureCode like '%77785%' 
                or PCMH.ProcedureCode like '%77786%' 
            or PCMH.ProcedureCode like '%77787%')
left outer join Credit as CR 
    on CPTREC.ActInstProcCodeSer = CR.ActInstProcCodeSer 
        and CPTREC.ActInstProcCodeRevCount = CR.ActInstProcCodeRevCount
inner join ActivityInstance as ACTIN 
    on CPTREC.ActivityInstanceSer= ACTIN.ActivityInstanceSer 
        and CPTREC.ActivityInstanceRevCount = ACTIN.ActivityInstanceRevCount
inner join ActivityCapture as ACTCAP 
    on ACTCAP.ActivityInstanceSer= ACTIN.ActivityInstanceSer 
        and ACTCAP.ActivityInstanceRevCount = ACTIN.ActivityInstanceRevCount
inner join ActCaptDiagnosisMH as ACTCAPDMH 
    on ACTCAPDMH.ActivityCaptureSer = ACTCAP.ActivityCaptureSer 
        and ACTCAPDMH.ActivityCaptureRevCount=ACTCAP.ActivityCaptureRevCount
left outer join Department as DEPT 
    on ACTCAP.DepartmentSer = DEPT.DepartmentSer
left outer join Hospitality as HOSP 
    on DEPT.HospitalitySer = HOSP.HospitalitySer
Left outer join Diagnosis as DIAG 
    on ACTCAPDMH.DiagnosisSer = DIAG.DiagnosisSer
inner join TemplateCycle as TEMPCYC 
    on ACTIN.TemplateCycleSer= TEMPCYC.TemplateCycleSer
inner join Template as PLATE 
    on TEMPCYC.TemplateSer = PLATE.TemplateSer
inner join Patent as PAT 
    on PLATE.PatentSer = PAT.PatentSer
Left Outer Join PatentParticular as PATPAR 
    on PAT.PatentSer = PATPAR.PatentSer
inner join PatentDoctor as PATDOC 
    on PAT.PatentSer = PATDOC.PatentSer
inner join Doctor as DOC 
    on PATDOC.ResourceSer = DOC.ResourceSer
WHERE CPTREC.CompletedDateTime >= @startdate
and CPTREC.CompletedDateTime < dateadd(dd,1,@enddate)
and CPTREC.ObjectStatus = 'Active'
and PATDOC.OncologistFlag = 0
and PATDOC.PrimaryFlag = 1

注:inner join簡単に簡略化できますjoin-innerデフォルトの結合タイプです。

于 2012-08-02T01:27:03.363 に答える