左联接的替代或条件替代方法

问题描述 投票:0回答:1
  • 我想从此查询的左联接中删除OR条件,因为它降低了查询性能。
    SELECT iEI.serviceType,iEim.masterAccno AS MasterAcc, 
    iED.triage_started_on, iED.triage_completed_on, 
    ifdm.id AS facDeptMappingId,iED.disposition_name AS disposition,
    FROM ip_loc_bed ib
    INNER JOIN ip_loc_area ia ON ia.id=ib.areaid 
      AND ia.statuscode='PUB' 
      AND ib.statusCode = 'PUB' 
      AND ia.deleteflag=0 
      AND ib.id IS NOT NULL
    INNER JOIN ip_loc_unit_area iua ON iua.areaid=ia.id 
      AND iua.statusCode='PUB' 
      AND iua.deleteFlag = 0
    INNER JOIN ip_loc_unit iu ON iu.id=iua.unitid 
      AND iu.deleteFlag = 0 AND iu.id IN(1)
    INNER JOIN ip_loc_fac_dept_mapping ifdm ON ifdm.id = iu.facDeptMappId 
      AND ifdm.deleteFlag = 0
    INNER JOIN edi_facilities ef ON ef.id = ifdm.facilityId
    INNER JOIN ip_loc_department id ON id.id = ifdm.departmentId 
      AND id.deleteFlag = 0
   **LEFT JOIN ip_encinfo iEI ON ((iEI.assBedId=ib.id) 
    OR (iEI.currBedId=ib.id)) AND iei.delflag = 0**

    LEFT JOIN ip_regservicetype irs ON irs.Id=iEI.serviceType 
    AND irs.delflag= 0
sql sql-server database join database-performance
1个回答
0
投票

替代是再次连接同一张表。

select coalesce(iei.serviceType, iei2.serviceType)
    , iEim.masterAccno as MasterAcc
    , iED.triage_started_on
    , iED.triage_completed_on
    , ifdm.id as facDeptMappingId
    , iED.disposition_name as disposition
from ip_loc_bed ib
inner join ip_loc_area ia on ia.id=ib.areaid and ia.statuscode='PUB' and ib.statusCode = 'PUB' and ia.deleteflag=0 and ib.id is not null
inner join ip_loc_unit_area iua on iua.areaid=ia.id and iua.statusCode='PUB' and iua.deleteFlag = 0
inner join ip_loc_unit iu on iu.id=iua.unitid and iu.deleteFlag = 0 and iu.id in(1)
inner join ip_loc_fac_dept_mapping ifdm on ifdm.id = iu.facDeptMappId and ifdm.deleteFlag = 0
inner join edi_facilities ef on ef.id = ifdm.facilityId
inner join ip_loc_department id on id.id = ifdm.departmentId and id.deleteFlag = 0
left join
    (select t2.serviceType, currBedId
        from ip_encinfo t1      
        inner join ip_regservicetype t2 on t2.serviceType = t1.serviceType
        where delflag = 0) as iei on iei.currBedId = ib.id
left join
    (select t2.serviceType, assBedId
        from ip_encinfo t1      
        inner join ip_regservicetype t2 on t2.serviceType = t1.serviceType
        where delflag = 0) as iei2 on iei2.assBedId = ib.id
© www.soinside.com 2019 - 2024. All rights reserved.