【发布时间】:2011-11-22 15:46:17
【问题描述】:
我想知道在下面的查询中是否有更好的方法来编写SELECT 子句。 status 有三种可能的情况。它的值可以是“A”或“N”或 null。
我认为在将 subTable 值与“A”值进行比较时,将 AND status = 'A' 放在 where 子句中是多余的。有什么办法可以更有效地重写它?我觉得限制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
)
【问题讨论】:
-
"WHERE 子句总是会给你一个'A'"——不一定;最里面的子选择可能不返回任何记录,因此外部子选择中的选定状态将为 NULL;然后 CASE 项目将评估为“I”。
-
status='A'的行和MAX(date_appoved)的行一样吗? -
你的意思是在那种情况下它会落入“ELSE”条款,对吧......?那么在这种情况下是的,但我的意思是,将 status = 'A' 放在 WHERE 子句中然后将 status 与 subTable 中的 'A' 进行比较不是多余的
-
@ypercube - 是的 date_approved 与状态在同一个表中。不知道你所说的“相同”是什么意思..
-
@user1060096:不,这不是多余的。冗余是(不需要的)相关子查询。避免它的一种方法是 Luis 的解决方案。