Лучший способ написания этого конкретного запроса SELECT в VIEW - PullRequest
2 голосов
/ 22 ноября 2011

Я хотел бы знать, есть ли лучший способ написания предложения SELECT в запросе ниже.Есть три возможных случая для status.Он может иметь значение «A», «N» или нуль.

Я думаю, что размещение AND status = 'A' в предложении where является избыточным, когда вы сравниваете значения subTable со значением «A».Есть ли способ, которым это можно было бы переписать более эффективно?Я чувствую, что ограничение статуса в предложении WHERE всегда будет давать вам 'A' и, следовательно, бессмысленно делать оператор CASE.

ALTER VIEW dbo.st_review_status_vw AS
(
    SELECT c.st_id, c.ms_price_comp_fy, 
        CASE
            WHEN (SELECT status FROM 
                    (SELECT st_id, status, ms_price_comp_fy
                     FROM ms_price_comp
                     WHERE st_id = c.st_id 
                         AND ms_price_comp_fy = c.ms_price_comp_fy 
                         AND status = 'A'
                     GROUP BY st_id, status, ms_price_comp_fy)
                 AS subTable) = 'A' THEN 'C'
            ELSE 'I'
        END AS status,
        MAX(date_approved) AS date_completed
    FROM ms_price_comp AS c
    GROUP BY c.st_id, c.ms_price_comp_fy
)

Ответы [ 2 ]

3 голосов
/ 22 ноября 2011

попробуйте

ALTER VIEW dbo.st_review_status_vw AS (
SELECT c.st_id, c.ms_price_comp_fy, 

    CASE WHEN MIN(status)  = 'A' THEN 'C'
    ELSE 'I'
    END AS status,

MAX(date_approved) AS date_completed
FROM ms_price_comp AS c
GROUP BY c.st_id, c.ms_price_comp_fy
)
0 голосов
/ 22 ноября 2011

Это похоже на то же самое для меня

ALTER VIEW dbo.st_review_status_vw AS (
SELECT
        c.st_id
    ,   c.ms_price_comp_fy
    ,   CASE
            WHEN MIN(status) = 'A' THEN 'C'
            ELSE 'I'
        END AS status
    ,   MAX(date_approved) AS date_completed
FROM ms_price_comp AS c
GROUP BY c.st_id, c.ms_price_comp_fy
)
...