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