2012-03-12 100 views
3

我有这个疑问:我如何摆脱这些子选择?

select distinct pdi.height, pdi.width, pj.jobnum 
     , (select count(barcode) from productiondoorinformation 
      inner join view_productionjobs on view_productionjobs.ctr=productiondoorinformation.productionjobsctr 
       where view_productionjobs.jobnum=pj.jobnum 
        and productiondoorinformation.height=pdi.height 
        and productiondoorinformation.width=pdi.width 
        and productiondoorinformation.alternaterating='PARTICLE') as particleqty 
     , (select count(barcode) from productiondoorinformation 
      inner join view_productionjobs on view_productionjobs.ctr=productiondoorinformation.productionjobsctr 
       where view_productionjobs.jobnum=pj.jobnum 
        and productiondoorinformation.height=pdi.height 
        and productiondoorinformation.width=pdi.width 
        and productiondoorinformation.alternaterating<>'PARTICLE') as laminatedqty 

    from productiondoorinformation pdi inner join view_productionjobs pj on pj.ctr=pdi.productionjobsctr 
       where pj.jobnum='' + @Jobnum + '' 

必须有一个更好的方式是一个更好的方式来做到这一点。我讨厌这些子选集,但是没有足够的精力去重写没有它们的东西。子查询有两种不同的数量,当你看到每个子句的where子句时,你会注意到这两个数量。

该查询需要9秒钟才能执行。太长了。我对这些表格写的任何其他查询都会立即返回。有什么建议么?我尝试了group by等,但只能使其以某种方式工作(粒子或粒子),但不能同时使用这两种方法。

返回的数据应该是这样的:

height | width | jobnum | particleqty | laminatedqty 
79  49  t1000 10   5 
78  49  t1000 1   3 
79  47  t1000 15   0 

回答

6

你是在正确的轨道上。您应该能够使用SUM,而不是COUNTGROUP BY

select pdi.height, pdi.width, pj.jobnum, 
     SUM(CASE pdi.alternaterating WHEN 'PARTICLE' THEN 1 ELSE 0 END) particleqty, 
     SUM(CASE pdi.alternaterating WHEN 'PARTICLE' THEN 0 ELSE 1 END) laminatedqty 
from productiondoorinformation pdi 
    inner join view_productionjobs pj on pj.ctr=pdi.productionjobsctr 
    where pj.jobnum='' + @Jobnum + '' 
group by pdi.height, pdi.width, pj.jobnum 

顺便说一句,不知道你需要大约@Jobnum那些单('')报价...

+0

+1 - 你的想法和我的一样,只有更好! – 2012-03-12 21:41:33

+0

我会再试一次,我希望它可以工作,但它今天不早。它不断将所有内容都汇总成叠层。我可能只是在错误的地方有东西。任何人,我会放手一搏。 – 2012-03-12 21:51:23

+0

如果'productiondoorinformation.alternaterating'不为null,这将正确工作。 – 2012-03-12 21:54:05

2

只是一个快速脱开 - 为什么不要将内部查询写成简单表格

CASE WHEN alternaterating = 'PARTICLE' THEN 1 ELSE 0 

然后查询该表格吗?