Как улучшить приведенный ниже SQL-запрос? - PullRequest
0 голосов
/ 07 февраля 2012

Пожалуйста, посмотрите на запрос ниже

select 
    DATEADD(wk, DATEDIFF(wk, 6, creation_ts), 6) creation_ts 
    ,sum(case when (priority = 'P1') then 1 else 0 end) as P1 
    ,sum(case when (priority = 'P2') then 1 else 0 end) as P2 
    ,sum(case when (priority = 'P3') then 1 else 0 end) as P3 
    ,sum(case when (priority = 'P4') then 1 else 0 end) as P4 
    ,sum(case when (priority = 'P5') then 1 else 0 end) as P5
    ,count(*) Total
from dbo.BugzillaTrans

where 
    (cf_projectnumber = @Project_Number or @Project_Number is null) 
and (product_id = @product_id or @product_id is null) 
and (component_id = @component_id or @component_id is null) 
and (creation_ts >= @Start_Dt or @Start_Dt is null) 
and (creation_ts <= @End_Dt or @End_Dt is null) 
and priority in ('P1','P2','P3','P4','P5') 
and assigned_to in (select EmailAddress from dbo.users where role_id = @role_id or @role_id is null) 
and assigned_to in (select EmailAddress from dbo.users where team_id = @team_id or @team_id is null)
and assigned_to in (select EmailAddress from dbo.users where location_id = @location_id or @location_id is null) 
 group by DATEADD(wk, DATEDIFF(wk, 6, creation_ts), 6)

Как можно понять, внутри предложения where я использую предложение SELECT для извлечения записи из таблицы пользователей.

and assigned_to in (select EmailAddress from dbo.users where role_id = @role_id or @role_id is null) 
and assigned_to in (select EmailAddress from dbo.users where team_id = @team_id or @team_id is null)
and assigned_to in (select EmailAddress from dbo.users where location_id = @location_id or @location_id is null) 

Как этого избежать и написать по-другому?

ИЛИ может ли быть лучший способ (очевидно, я уверен, что будет) написать всю эту программу?

Спасибо

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

Существует (как вы указали), вероятно, миллион способов переписать этот запрос в целом, но на конкретный вопрос, который вы задаете о том, как избежать подвыборов, можно ответить с помощью inner join.

SELECT 
    DATEADD(wk, DATEDIFF(wk, 6, bt.creation_ts), 6) AS creation_ts 
    ,SUM(CASE WHEN (bt.priority = 'P1') THEN 1 ELSE 0 END) AS P1 
    ,SUM(CASE WHEN (bt.priority = 'P2') THEN 1 ELSE 0 END) AS P2 
    ,SUM(CASE WHEN (bt.priority = 'P3') THEN 1 ELSE 0 END) AS P3 
    ,SUM(CASE WHEN (bt.priority = 'P4') THEN 1 ELSE 0 END) AS P4 
    ,SUM(CASE WHEN (bt.priority = 'P5') THEN 1 ELSE 0 END) AS P5
    ,COUNT(*) Total
FROM dbo.BugzillaTrans bt 
JOIN dbo.users u
    ON  bt.assigned_to = u.EmailAddress
WHERE   (bt.cf_projectnumber = @Project_Number OR @Project_Number IS NULL)
AND     (bt.product_id = @Product_ID OR @Product_ID IS NULL)
AND     (bt.component_id = @Component_ID OR @Component_ID IS NULL)
AND     (bt.creation_ts >= @Start_DT OR @Start_DT IS NULL)
AND     (bt.creation_ts <= @End_DT OR @End_DT IS NULL)
AND     (bt.priority IN ('P1', 'P2', 'P3', 'P4', 'P5'))
AND     (u.role_id = @Role_ID OR @Role_ID IS NULL)
AND     (u.team_id = @Team_ID OR @Team_ID IS NULL)
AND     (u.location_id = @Location_ID OR @Location_ID IS NULL)
GROUP BY
        DATEADD(WEEK, DATEDIFF(WEEK, 6, bt.creation_ts), 6)
1 голос
/ 07 февраля 2012
and assigned_to in (select EmailAddress from dbo.users where role_id = @role_id or @role_id is null)  
and assigned_to in (select EmailAddress from dbo.users where team_id = @team_id or @team_id is null) 
and assigned_to in (select EmailAddress from dbo.users where location_id = @location_id

можно переписать как:

and assigned_to in
  ( select EmailAddress from dbo.users where ( role_id = @role_id or @role_id is null ) and
    ( team_id = @team_id or @team_id is null ) and ( location_id = @location_id ) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...