将 CTE 存储过程转换为 Mysql 兼容的数据库查询
Posted
技术标签:
【中文标题】将 CTE 存储过程转换为 Mysql 兼容的数据库查询【英文标题】:Convert CTE Stored Procedure to Mysql Compatible Database Query 【发布时间】:2019-10-05 11:46:48 【问题描述】:我的分类表是
TABLE [Category](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Title] [nvarchar](512) NULL,
[Slug] [nvarchar](512) NULL,
[Details] [text] NULL,
[CategoryType] [int] NOT NULL,
[ParentId] [int] NULL,
[SortOrder] [int] NOT NULL
)
我的 CTE 存储过程是
CREATE PROCEDURE [dbo].[sp_AllCategoryPath]
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
;WITH CTE AS
(
SELECT Id, Title, Title as Path, ParentId, cast(Id as nvarchar(125)) as LinkPath,Slug
FROM Category
WHERE ParentId IS NULL
UNION ALL
SELECT t.[Id], t.[Title],
cast(cte.[Path] +'/'+ t.Title as nvarchar(512)),
t.ParentId,
cast(cte.[LinkPath] +'/'+ CONVERT(varchar(512), t.Id) as nvarchar(125)),
t.Slug
FROM Category t
INNER JOIN CTE ON t.ParentId = CTE.Id
)
SELECT cte.Id, cte.Title, cte.Path, cte.ParentId , c.Title as ParentName, LinkPath,cte.Slug
FROM CTE cte LEFT JOIN Category c ON cte.ParentId = c.Id
ORDER BY cte.Path
END
如何将此 cte sp 查询转换为 mysql sp 兼容版本? 我想将我的 sp 更改为查询,因为我正在将我的 asp.net 核心应用程序数据库提供程序 MSSQL 更改为 MySql 服务器。 但我无法将 cte sp 更改为正常的 sp 查询。 MySql 服务器版本 5.1.73
【问题讨论】:
它是一个递归 CTE,从 MySQL 8.0 开始它被原生支持。你应该升级你的 MySQL 谢谢@LukaszSzozda,但我现在无法更改 MySql 版本。 那你的问题太笼统了。请阅读一些内容,努力翻译这个查询,然后返回这里并提出具体问题。 How to transform a MSSQL CTE query to MySQL?的可能重复 【参考方案1】:您可以使用WHILE
、LOOP
或REPEAT..UNTIL
等 MySQL 流控制语句来模拟 RCTE 行为,但所有这些语句仅允许在存储的例程、函数、触发器和事件中使用。你不能在像SELECT
这样的普通查询中使用它们。
如果您可以在 MySQL 中使用像 CALL AllCatPath(...)
这样的存储例程,那么您可以自己实现递归。如果不允许存储例程,那么您必须迁移到 MySQL 中树的另一个实现,例如“嵌套集”。
【讨论】:
以上是关于将 CTE 存储过程转换为 Mysql 兼容的数据库查询的主要内容,如果未能解决你的问题,请参考以下文章
如何将 MySQL 语法 WITH `cte` AS (VALUES ROW(1), ROW(2), ROW(n)) 转换为 jOOQ DSL?
将 PostgreSQL 递归 CTE 转换为 SQL Server