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

标签 mysql sql sql-server oracle

在我们的产品中,我们正在扩展对 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;

最佳答案

您可以使用相同的查询来删除 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) 表达式执行原始查询之前,您只需要更改 session 将隔离级别设置为 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 - 如何将 MS-SQL Server SELECT 查询转换/迁移到 Oracle 和 MySQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59434443/

相关文章:

mysql - 在Mysql中加入寄存器

mysql - 使用引用不同表的触发器

sql - 将sqlite数据库转换为sdf文件

sql-server - 稀疏 Varchar(最大值)

c# - 为什么在将对象转换为整数时会出现 InvalidCastException?

sql-server - MS SQL 批量插入

php - 在CodeIgniter 4中保存到数据库后如何获取插入ID

mysql索引问题

sql - Django QuerySet 过滤器使用给定的排序列表

mysql - 在不使用连接的情况下从两个不同的表中选择数据