我该如何摆脱这些子选择?

时间:2012-03-12 21:31:10

标签: sql sql-server-2005

我有这个问题:

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等,但只能让它以某种方式工作(粒子或&lt;&gt;粒子),但不能同时工作。

返回的数据应如下所示:

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

2 个答案:

答案 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周围是否需要那些单引号('')...

答案 1 :(得分:2)

快速抛弃 - 为什么不将内部查询编写为带有

的简单表
CASE WHEN alternaterating = 'PARTICLE' THEN 1 ELSE 0

然后查询该表?