将 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】:

您可以使用WHILELOOPREPEAT..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

mySQL 存储过程中未知的无效类型转换

将 SQL Server 中的递归 CTE 转换为 netezza

如何给SQLSERVER存储过程传递数组参数

如何将 SQL Server 存储过程迁移到 Mysql [关闭]