如何获得';通用表表达式';在Mysql过程中

如何获得';通用表表达式';在Mysql过程中,mysql,sql-server,stored-procedures,common-table-expression,Mysql,Sql Server,Stored Procedures,Common Table Expression,我有一个MSsql过程,我想把它转换成Mysql过程,但我不知道如何在Mysql中转换“CTE”表达式 以下是我发布的相关程序: WITH CTE AS ( SELECT ROW_NUMBER() OVER ( ORDER BY CASE WHEN @SortColumnName = 'UserID'

我有一个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]
                 )

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

;with cte as
(
    select column
      from table
)
select *
  from cte
你可以写:

select *
  from (select column
          from table) as cte

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

MySQL支持派生表,CTE和SQL中的派生表性能相同,都是表表达式

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

但这只是解决你在CTE上的问题

如上所述,MySQL中没有Row_编号,但请查看此页面以了解该部分的答案:

编辑:新示例通过删除行数并使用限制:

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


这将很容易移植到PostgreSQL,但不能移植到MySQL-它不支持CTE,不支持
OVER
,不支持
行号(),列表还在继续…@mvp Thnx用于您的快速响应…但是对于相同的逻辑,是否有任何方法可以获得所需的结果..在mysql Thnx中,但是如何在表达式中设置条件…请提供帮助,因为我在这个领域非常新手…Thanx,但我遇到了错误“脚本行:4您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以获得正确的语法,以便在第17行使用near'(当SortColumnName='UserID'和SortOrderBy='asc'THEN User'时按情况排序)"虽然executing@vikas这可能与排名函数有关。MySQL不支持Row_Number,但有一些方法可以解决此问题。请参阅此页,然后更改该位。@vikas我想我已经得到了您想要做的事情,有一种更简单的方法:完全去掉Row Number和over by子句,然后将case语句放入您的order by子句并使用limit函数获得一个特定的行。这样,您仍然可以传入一个参数来指定按哪个列进行排序,并且该限制将消除执行行号的需要。我将在一分钟左右用示例代码更新我的帖子。
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;
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