需要在where子句中替换case语句

时间:2018-03-21 07:00:14

标签: tsql

**以下查询效果不佳,我计划将case条件中的where stmt替换为temp table。请告诉我一些重写此查询的选项

有没有办法将其简化为多个SQL

另请解释这个case stmt在where子句**

中的工作原理
select DISTINCT 
                   ph.order_type_cd, 
                   c.order_num, 
                   ph.created_date, 
                   os.order_status_desc, 
                   ph.facility_name, 
                   PH.vendor_order_num, 
                   l.lic_nm, 
                   (u.last_nm + ', ' + u.first_nm )as requestor_nm, 
                   bl.billing_location_desc, 
                   ph.ship_to_name, 
                   dm.dispatch_method_name_desc as courier, 
                   PH.po_last_updated_dt as last_updated_date, 
                   (u1.last_nm + ', ' + u1.first_nm )as last_updated_by, 
                   ph.right_grp_id, 
                   c.line_id, 
                   a.material_product_id, 
                   a.parent_material_product_id 

 from avt_po_detail c 
       inner join avt_po_hdr ph on ph.order_num = c.order_num 
       left outer join avt_material_product AS a on a.material_product_id=c.material_product_id 

         INNER JOIN #entity_ids po on po.entity_id = c.order_num --or @select_pos = 0 ) 

         LEFT OUTER JOIN dbo.ert_product AS pc ON pc.product_id = a.product_id 
         left outer join ert_product_type as pt on pt.product_type_cd = pc.product_type_cd 
         LEFT OUTER JOIN dbo.ert_product_xref as xref on xref.product_id = a.parent_product_id AND xref.version_id = 1 
         left outer join avt_order_status AS OS ON OS.order_status_cd = PH.order_status_cd 
         left outer join avt_licensee l on l.lic_id = ph.lic_id 
         left outer join avt_po_from pf on pf.material_product_id = a.material_product_id and pf.line_id = c.line_id 
         left outer join avt_po_audio_detail pad on pad.line_id = c.line_id 
         left outer join avt_materials_trans_material MTM on mtm.sequence_no = c.video_seq_no 
         left outer join avt_user u on u.userid = ph.requestor_id 
         left outer join avt_user u1 on u1.userid = ph.po_last_updated_by 
         left outer join avt_billing_location bl on bl.billing_location_cd = PH.billing_location_cd 
         left outer join avt_dispatch_method_name dm on dm.dispatch_method_name_id = PH.dispatch_method_name_id 
         left outer join avt_right_group arg on arg.right_grp_id = ph.right_grp_id 
         left outer join #prod product on product.product_id=a.product_id and (product.version_id=c.dist_version_id OR product.version_id = 1) 
       where (pf.from_desc in ( select from_desc from #from_desc ) or @select_form = 0) 
         and (case WHEN c.dist_version_id IS NULL THEN c.UCS_prod_no 
           ELSE 
               CASE 
                WHEN isnull(pt.version_control_ind, 'N') = 'Y' THEN xref.rss_prod_no 
                WHEN 
                   isnull(pt.version_control_ind, 'N') = 'N' AND 
                   xref.rss_prod_no IS NULL AND 
                   xref.rss_film_id IS NULL THEN xref.rss_titleid 
                WHEN 
                   isnull(pt.version_control_ind, 'N') = 'N' AND 
                   xref.rss_prod_no IS NOT NULL AND 
                   xref.rss_film_id IS NULL THEN substring(pc.glacct, 24, 5) -- ASR 3290687 
                WHEN isnull(pt.version_control_ind, 'N') = 'N' AND xref.rss_film_id IS NOT NULL THEN isnull(substring(pc.glacct, 24, 5), -- ASR 3290687 
                   ( 
                      SELECT substring(dbo.ert_product.glacct, 24, 5) -- ASR 3290687 
                      FROM dbo.ert_product 
                      WHERE dbo.ert_product.product_id = a.parent_product_id 
                   )) 
             END 
               END in (select prod_no from #prod_no) or @prod_no = 0) 

0 个答案:

没有答案