如何将 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?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Sqoop 将数据从 MS-SQL 服务器写入 HDFS