Как мне избавиться от этих подвыборов? - PullRequest
3 голосов
/ 13 марта 2012

У меня есть этот запрос:

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 для каждой из них.

Этот запрос занимает девять секунд. Это слишком долго Любой другой запрос, который я написал к этим таблицам, немедленно возвращается. Какие-либо предложения? Я пробовал группировать и т. Д., Но могу заставить его работать только так или иначе (частица или <> частица), но не оба.

Возвращенные данные должны выглядеть следующим образом:

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

Ответы [ 2 ]

6 голосов
/ 13 марта 2012

Вы на правильном пути. Вы должны иметь возможность использовать SUM вместо COUNT и GROUP 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 ...

2 голосов
/ 13 марта 2012

Просто быстрый отказ - почему бы не написать внутренний запрос в виде простой таблицы с

CASE WHEN alternaterating = 'PARTICLE' THEN 1 ELSE 0

, а затем выполнить запрос к этой таблице?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...