如何将 MS-SQL Server SELECT 查询转换/迁移到 Oracle 和 MySQL?

Posted

技术标签:

【中文标题】如何将 MS-SQL Server SELECT 查询转换/迁移到 Oracle 和 MySQL?【英文标题】:How to Convert/Migrate MS-SQL Server SELECT Query To Oracle & MySQL? 【发布时间】:2020-04-13 12:14:27 【问题描述】:

在我们的产品中,我们正在扩展对 Oracle 和 mysql 的支持,所以任何人都可以帮助迁移以下示例 SQL 查询,该查询可以在 MS-SQL Server 上正常工作,我已经尝试过,但不知何故它不适用于 Oracle /MySQL,非常感谢您的帮助,并将自行转换其余查询,谢谢。

SELECT  A.SERVERID,A.DATAID 
                ,A.CREATETIMESTAMP AS 'Date Time'
                ,A.OBJECTINSTNAME
                ,A.PROJECTNAME 
                ,TEMP_IND_1.TEMP_ROW_NUM FROM DATALOG AS A WITH (NOLOCK) INNER JOIN
                ( 
                    SELECT      DATAID,ROW_NUMBER() OVER(ORDER BY CREATETIMESTAMP DESC) AS TEMP_ROW_NUM FROM    DATALOG WITH (NOLOCK)

            WHERE PROJECTNAME='ProjectA'
            ) AS TEMP_IND_1 ON A.DATAID = TEMP_IND_1.DATAID

         WHERE TEMP_IND_1.TEMP_ROW_NUM BETWEEN 1 AND 50;

【问题讨论】:

请包括您尝试过的内容以及您遇到的错误消息或意外行为,因为就您的问题而言,它基本上是这样写的:请免费为我工作。我知道这不是你的意图,但它仍然是这样读的。顺便说一句,我认为您无需在此查询中进行太多修改即可使其适用于 oracle 和 mysql v8。 @Shadow 绝对不是,这取决于您的想法以及在决定意图之前如何看待它,我相信,不过感谢您的评论。 【参考方案1】:

您可以使用相同的查询来删除WITH (NOLOCK) 部分。因为它们在 oracle 中无效,并且您在 oracle 中不需要它们。并且在没有as 关键字的情况下给出了列别名,并且列别名必须是双引号。所以你的查询变成了这样:

SELECT  A.SERVERID,A.DATAID 
                ,A.CREATETIMESTAMP  "Date Time"
                ,A.OBJECTINSTNAME
                ,A.PROJECTNAME 
                ,TEMP_IND_1.TEMP_ROW_NUM FROM DATALOG A INNER JOIN
                ( 
                    SELECT DATAID,
                           ROW_NUMBER() OVER(ORDER BY CREATETIMESTAMP DESC) TEMP_ROW_NUM 
                           FROM    DATALOG 
            WHERE PROJECTNAME='ProjectA'
            ) TEMP_IND_1 ON A.DATAID = TEMP_IND_1.DATAID
         WHERE TEMP_IND_1.TEMP_ROW_NUM BETWEEN 1 AND 50;

编辑:

对于 mysql,您只需要更改会话以在不使用 with (no lock) 表达式的情况下执行原始查询之前将隔离级别设置为 read uncommited

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
 -- your query without no lock expressions
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ; -- set back to original isolation level

【讨论】:

感谢您的快速更新,非常感谢,它很有见地。 您想为 MySQL 语法添加任何 cmets,谢谢。

以上是关于如何将 MS-SQL Server SELECT 查询转换/迁移到 Oracle 和 MySQL?的主要内容,如果未能解决你的问题,请参考以下文章

<>(尖括号)在 MS-SQL Server 中是啥意思?

如何在查询中加入 MS-SQL 和 MySQL 表?

使用 Sqoop 将数据从 MS-SQL 服务器写入 HDFS

如何让 ms-access 以其他用户身份连接到 ms-sql?

如何在简单的 PostgreSQL 脚本中使用变量?

如何从 SQL Server 中的 SELECT 更新?