开发者社区 问答 正文

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

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

展开
收起
心有灵_夕 2019-12-22 14:34:03 1049 分享 版权
阿里云 AI 助理回答

在Oracle和MySQL中,你不能直接使用SQL Server特定的语法,如WITH (NOLOCK)。这些是SQL Server中的表提示,用于控制锁定行为,但在Oracle和MySQL中有不同的处理方式。同时,窗口函数(如ROW_NUMBER())的用法在所有数据库之间也是兼容的,但语法可能略有不同。下面是针对Oracle和MySQL修改后的查询示例:

Oracle版本:

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

在Oracle中,我们通常不需要显式地控制锁,因为读取数据时默认的行为已经考虑了并发性。如果你确实需要控制并发访问,可以考虑使用适当的事务隔离级别或选择合适的锁类型,但这通常是在会话或事务级别设置的,而不是在查询中。

MySQL版本:

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

在MySQL中,同样没有直接等同于SQL Server的WITH (NOLOCK)的选项,而且对于大多数常规查询,MySQL的默认隔离级别(可重复读)已经足够处理并发问题。如果需要调整事务隔离级别或锁行为,可以在连接数据库时或在事务开始前设置。

请确保在执行这些修改后的查询之前,你的数据库环境已正确配置,并且理解它们在新环境中的行为可能与原始SQL Server查询有所不同。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答