在我们的产品中,我们正在扩展对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查询有所不同。