0

我有 MSsql 过程,我想将其转换为 Mysql 过程,但我不知道如何在 mysql 中转换“CTE”表达式。

下面我发布我的相关程序:

  WITH    CTE
              AS ( SELECT   ROW_NUMBER() OVER ( ORDER BY CASE
                                                          WHEN @SortColumnName = 'UserID'
                                                          AND @SortOrderBy = 'asc'
                                                          THEN UserID
                                                         END ASC, CASE
                                                          WHEN @SortColumnName = 'UserID'
                                                          AND @SortOrderBy = 'desc'
                                                          THEN UserID
                                                          END DESC) AS RN ,
                            UserID ,
                            UserName ,
                            FirstName ,
                            MiddleName ,
                            LastName ,
                            EmailID
                   FROM     [Users]
                 )
4

2 回答 2

0

您可以将其更改为子查询,即代替:

;with cte as
(
    select column
      from table
)
select *
  from cte

你可以写:

select *
  from (select column
          from table) as cte
于 2013-01-23T07:37:06.410 回答
0

您需要使用派生表,因为您正在使用排名函数 Row_Number,显然您现在需要在 WHERE 子句中引用它。

MySQL支持派生表,在SQL中CTE和派生表的性能是一样的,都是表表达式。

您的新代码将如下所示:(取决于上面未列出的您的需要)

SELECT *
FROM
    (SELECT ROW_NUMBER() OVER (
        ORDER BY 
         CASE WHEN @SortColumnName = 'UserID' AND @SortOrderBy = 'asc' THEN UserID END ASC, 
         CASE WHEN @SortColumnName = 'UserID' AND @SortOrderBy = 'desc' THEN UserID END DESC
    ) AS RN,
      UserID ,
      UserName ,
      FirstName ,
      MiddleName ,
      LastName ,
      EmailID
     FROM     [Users]
 ) DTABLE
WHERE DTABLE.RN = 1;

但这仅涉及您关于 CTE 的问题。

如上所述,Row_Number 在 MySQL 中不可用,但请查看此页面以获取该部分的答案:MySQL 中的 ROW_NUMBER()

编辑:新示例删除 Row_Number 并使用 LIMIT:

(如下所述,有一种更简单的方法可以完成可变排序和获取特定行,请参见下面的查询。)

SELECT
      UserID ,
      UserName ,
      FirstName ,
      MiddleName ,
      LastName ,
      EmailID
FROM     
    [Users]
ORDER BY 
         CASE WHEN @SortColumnName = 'UserID' AND @SortOrderBy = 'asc' THEN UserID END ASC, 
         CASE WHEN @SortColumnName = 'UserID' AND @SortOrderBy = 'desc' THEN UserID END DESC END
LIMIT 1,1
于 2013-01-23T07:56:29.407 回答