在 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_idms_price_comp_fyWHEN status = 'A' 将测试他们的任意行。

以上是关于在 VIEW 中编写此特定 SELECT 查询的更好方法的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - View 的 SELECT 在 FROM 子句中包含一个子查询

编写以下 SQL 查询的更有效方法

如何在 ZF 中编写此查询?

sql - 有没有办法过滤SELECT查询的结果,使用另一个SELECT查询?

为啥来自 VIEW 的 SELECT * 比来自同一个 VIEW 的 SELECT(特定列)执行得更快?

如何在 eloquent ORM 中执行此搜索查询