在我们的产品中,我们正在扩展对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中,你不能直接使用SQL Server特定的语法,如WITH (NOLOCK)。这些是SQL Server中的表提示,用于控制锁定行为,但在Oracle和MySQL中有不同的处理方式。同时,窗口函数(如ROW_NUMBER())的用法在所有数据库之间也是兼容的,但语法可能略有不同。下面是针对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;
在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;
在MySQL中,同样没有直接等同于SQL Server的WITH (NOLOCK)的选项,而且对于大多数常规查询,MySQL的默认隔离级别(可重复读)已经足够处理并发问题。如果需要调整事务隔离级别或锁行为,可以在连接数据库时或在事务开始前设置。
请确保在执行这些修改后的查询之前,你的数据库环境已正确配置,并且理解它们在新环境中的行为可能与原始SQL Server查询有所不同。