在 VIEW 中编写此特定 SELECT 查询的更好方法
Posted
技术标签:
【中文标题】在 VIEW 中编写此特定 SELECT 查询的更好方法【英文标题】:A better way of writing this particular SELECT query in a VIEW 【发布时间】: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 的解决方案。
【参考方案1】:
试试这个
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
)
【讨论】:
MIN()
可用于文本字段:MIN('A', 'N', 'N', NULL) = 'A'
。
@user1060096:您可以勾选最有帮助的答案。
@ypercube 我的意思是,如果“搜索”状态是“K”而不是“A”并且其他有效状态是“J”和“M”,那么表达式:CASE WHEN @987654324 @THEN 'C' ELSE 'I' END AS 状态是解决问题的通用方法
@LuisSiquot:是的,这是解决更普遍问题的方法。【参考方案2】:
这对我来说似乎是一样的
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
)
【讨论】:
我可能不止一行具有相同的st_id
和ms_price_comp_fy
。 WHEN status = 'A'
将测试他们的任意行。以上是关于在 VIEW 中编写此特定 SELECT 查询的更好方法的主要内容,如果未能解决你的问题,请参考以下文章
MySQL - View 的 SELECT 在 FROM 子句中包含一个子查询
sql - 有没有办法过滤SELECT查询的结果,使用另一个SELECT查询?