如何获得';通用表表达式';在Mysql过程中
我有一个MSsql过程,我想把它转换成Mysql过程,但我不知道如何在Mysql中转换“CTE”表达式 以下是我发布的相关程序:如何获得';通用表表达式';在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'
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