在视图中使用变量的替代方法

Posted

技术标签:

【中文标题】在视图中使用变量的替代方法【英文标题】:Alternative to using Variable in a View 【发布时间】:2021-02-25 19:04:14 【问题描述】:

我需要一些帮助来构建一个 SQL 语句,该语句将输出每个客户端的前 5 个退役资产,这些资产可以放入 SQL 视图中。

我已经构建了以下 SQL 语句,但它在视图中不起作用,需要替代方法。

SET @row_number := 0;

SELECT DISTINCT NAME, RetiredDate, COMMENT, 
  @row_number:=CASE WHEN @client_ID=clientID THEN @row_number+1 ELSE 1 END AS num, 
  @client_ID:=clientID ClientID
FROM `retiredassets`
WHERE `retiredassets`.`ClientID` IN(SELECT clientID FROM `clients`)
HAVING num <=5

有人对我有什么建议吗?上述语句完美运行,但不能在 SQL 视图中运行。

【问题讨论】:

你运行的是哪个版本的 mysql 我们目前使用的是 MySQL 5.7。 【参考方案1】:

在 MySQL 8.0 中应该是:

WITH cte AS (
    SELECT r.NAME, r.RetiredDate, r.COMMENT,
      ROW_NUMBER() OVER (PARTITION BY r.ClientID ORDER BY ...) AS num,
      r.ClientID
    FROM retiredassets
    JOIN clients USING (ClientID)
)
SELECT * FROM cte WHERE num <= 5;

我离开了...,因为我不知道您的订单是什么。您的原始查询未指定订单,因此您必须选择一个。


请回复您的评论。

如果不能升级到 MySQL 8.0,并且不能在 VIEW 定义中使用变量,那么就不能使用 VIEW。使用时必须写出完整的查询,直到可以升级到 MySQL 8.0。

【讨论】:

我们实际上使用的是 MySQL Server 5.7,所以不幸的是,这不适用于我的实例。我实际上尝试过类似的操作并确认该命令不起作用。

以上是关于在视图中使用变量的替代方法的主要内容,如果未能解决你的问题,请参考以下文章

替代索引视图

相机顶部的 OpenGL 视图的替代方法

使用 UINavigationController 工具栏的替代方法

JSP for Spring MVC视图层的替代方案

平移和缩放的替代方案

在 django 中使用物化视图或替代方案