sql语句转Oracle语句。

我们单位自己是有一个备份数据库,是sqlserver。然后我自己写了一些语句,都是正常的。现在想用到实时更新的Oracle数据库上,想把sql语句转化成Oracle语句。。

select top 40 r.STCD,sum(r.DRP) as DRP_SUM ,b.STNM,b.STLC,b.ADMAUTH from RWDB.dbo.ST_PPTN_R r left join RWDB.dbo.ST_STBPRP_B b on r.STCD=b.STCD where r.TM >= DATEADD(hour,-1,GETDATE()) group by r.STCD,b.STNM,b.STLC,b.ADMAUTH order by sum(r.DRP) desc
select top 40 r.STCD,sum(r.DRP) as DRP_SUM ,b.STNM,b.STLC,b.ADMAUTH from RWDB.dbo.ST_PPTN_R r left join RWDB.dbo.ST_STBPRP_B b on r.STCD=b.STCD where r.TM >= DATEADD(hour,-3,GETDATE()) group by r.STCD,b.STNM,b.STLC,b.ADMAUTH order by sum(r.DRP) desc
select top 40 r.STCD,sum(r.DRP) as DRP_SUM ,b.STNM,b.STLC,b.ADMAUTH from RWDB.dbo.ST_PPTN_R r left join RWDB.dbo.ST_STBPRP_B b on r.STCD=b.STCD where r.TM >= DATEADD(hour,-6,GETDATE()) group by r.STCD,b.STNM,b.STLC,b.ADMAUTH order by sum(r.DRP) desc
select top 40 r.STCD,sum(r.DRP) as DRP_SUM ,b.STNM,b.STLC,b.ADMAUTH from RWDB.dbo.ST_PPTN_R r left join RWDB.dbo.ST_STBPRP_B b on r.STCD=b.STCD where r.TM >= DATEADD(hour,-12,GETDATE()) group by r.STCD,b.STNM,b.STLC,b.ADMAUTH order by sum(r.DRP) desc
select top 40 r.STCD,sum(r.DRP) as DRP_SUM ,b.STNM,b.STLC,b.ADMAUTH from RWDB.dbo.ST_PPTN_R r left join RWDB.dbo.ST_STBPRP_B b on r.STCD=b.STCD where r.TM >= DATEADD(hour,-24,GETDATE()) group by r.STCD,b.STNM,b.STLC,b.ADMAUTH order by sum(r.DRP) desc

参考gpt:
以下是将您的SQL Server语句转换为Oracle语句的示例:

SELECT *
FROM (
    SELECT r.STCD, SUM(r.DRP) AS DRP_SUM, b.STNM, b.STLC, b.ADMAUTH
    FROM RWDB.ST_PPTN_R r
    LEFT JOIN RWDB.ST_STBPRP_B b ON r.STCD = b.STCD
    WHERE r.TM >= SYSDATE - INTERVAL '1' HOUR
    GROUP BY r.STCD, b.STNM, b.STLC, b.ADMAUTH
    ORDER BY SUM(r.DRP) DESC
)
WHERE ROWNUM <= 40;

SELECT *
FROM (
    SELECT r.STCD, SUM(r.DRP) AS DRP_SUM, b.STNM, b.STLC, b.ADMAUTH
    FROM RWDB.ST_PPTN_R r
    LEFT JOIN RWDB.ST_STBPRP_B b ON r.STCD = b.STCD
    WHERE r.TM >= SYSDATE - INTERVAL '3' HOUR
    GROUP BY r.STCD, b.STNM, b.STLC, b.ADMAUTH
    ORDER BY SUM(r.DRP) DESC
)
WHERE ROWNUM <= 40;

SELECT *
FROM (
    SELECT r.STCD, SUM(r.DRP) AS DRP_SUM, b.STNM, b.STLC, b.ADMAUTH
    FROM RWDB.ST_PPTN_R r
    LEFT JOIN RWDB.ST_STBPRP_B b ON r.STCD = b.STCD
    WHERE r.TM >= SYSDATE - INTERVAL '6' HOUR
    GROUP BY r.STCD, b.STNM, b.STLC, b.ADMAUTH
    ORDER BY SUM(r.DRP) DESC
)
WHERE ROWNUM <= 40;

SELECT *
FROM (
    SELECT r.STCD, SUM(r.DRP) AS DRP_SUM, b.STNM, b.STLC, b.ADMAUTH
    FROM RWDB.ST_PPTN_R r
    LEFT JOIN RWDB.ST_STBPRP_B b ON r.STCD = b.STCD
    WHERE r.TM >= SYSDATE - INTERVAL '12' HOUR
    GROUP BY r.STCD, b.STNM, b.STLC, b.ADMAUTH
    ORDER BY SUM(r.DRP) DESC
)
WHERE ROWNUM <= 40;

SELECT *
FROM (
    SELECT r.STCD, SUM(r.DRP) AS DRP_SUM, b.STNM, b.STLC, b.ADMAUTH
    FROM RWDB.ST_PPTN_R r
    LEFT JOIN RWDB.ST_STBPRP_B b ON r.STCD = b.STCD
    WHERE r.TM >= SYSDATE - INTERVAL '24' HOUR
    GROUP BY r.STCD, b.STNM, b.STLC, b.ADMAUTH
    ORDER BY SUM(r.DRP) DESC
)
WHERE ROWNUM <= 40;


TechWhizKid参考GPT回答:

在Oracle中,不使用TOP关键字,而是使用ROWNUM进行限制。同时,日期和时间的处理方法与SQL Server不同,Oracle中使用SYSDATEINTERVAL。因此,您的SQL语句可以被转化为如下Oracle语句:

对于第一条语句:

SELECT * FROM 
    (SELECT r.STCD, SUM(r.DRP) AS DRP_SUM, b.STNM, b.STLC, b.ADMAUTH
     FROM RWDB.ST_PPTN_R r 
     LEFT JOIN RWDB.ST_STBPRP_B b ON r.STCD = b.STCD 
     WHERE r.TM >= SYSDATE - INTERVAL '1' HOUR
     GROUP BY r.STCD, b.STNM, b.STLC, b.ADMAUTH 
     ORDER BY SUM(r.DRP) DESC)
WHERE ROWNUM <= 40

第二条语句:

SELECT * FROM 
    (SELECT r.STCD, SUM(r.DRP) AS DRP_SUM, b.STNM, b.STLC, b.ADMAUTH
     FROM RWDB.ST_PPTN_R r 
     LEFT JOIN RWDB.ST_STBPRP_B b ON r.STCD = b.STCD 
     WHERE r.TM >= SYSDATE - INTERVAL '3' HOUR
     GROUP BY r.STCD, b.STNM, b.STLC, b.ADMAUTH 
     ORDER BY SUM(r.DRP) DESC)
WHERE ROWNUM <= 40

第三条语句:

SELECT * FROM 
    (SELECT r.STCD, SUM(r.DRP) AS DRP_SUM, b.STNM, b.STLC, b.ADMAUTH
     FROM RWDB.ST_PPTN_R r 
     LEFT JOIN RWDB.ST_STBPRP_B b ON r.STCD = b.STCD 
     WHERE r.TM >= SYSDATE - INTERVAL '6' HOUR
     GROUP BY r.STCD, b.STNM, b.STLC, b.ADMAUTH 
     ORDER BY SUM(r.DRP) DESC)
WHERE ROWNUM <= 40

第四条语句:

SELECT * FROM 
    (SELECT r.STCD, SUM(r.DRP) AS DRP_SUM, b.STNM, b.STLC, b.ADMAUTH
     FROM RWDB.ST_PPTN_R r 
     LEFT JOIN RWDB.ST_STBPRP_B b ON r.STCD = b.STCD 
     WHERE r.TM >= SYSDATE - INTERVAL '12' HOUR
     GROUP BY r.STCD, b.STNM, b.STLC, b.ADMAUTH 
     ORDER BY SUM(r.DRP) DESC)
WHERE ROWNUM <= 40

第五条语句:

SELECT * FROM 
    (SELECT r.STCD, SUM(r.DRP) AS DRP_SUM, b.STNM, b.STLC, b.ADMAUTH
     FROM RWDB.ST_PPTN_R r 
     LEFT JOIN RWDB.ST_STBPRP_B b ON r.STCD = b.STCD 
     WHERE r.TM >= SYSDATE - INTERVAL '24' HOUR
     GROUP BY r.STCD, b.STNM, b.STLC, b.ADMAUTH 
     ORDER BY SUM(r.DRP) DESC)
WHERE ROWNUM <= 40

小时差多少就是 减去24分之几,然后oracle 取前多少行可以使用rownum实现

select * from ( select  r.STCD, sum(r.DRP) as DRP_SUM, b.STNM, b.STLC, b.ADMAUTH
  from RWDB.dbo.ST_PPTN_R r
  left join RWDB.dbo.ST_STBPRP_B b
    on r.STCD = b.STCD
 where r.TM >= SYSDATE - (1/24)
 group by r.STCD, b.STNM, b.STLC, b.ADMAUTH
 order by sum(r.DRP) desc )    where rownum<41

//1
select *
from (
    select r.STCD, sum(r.DRP) as DRP_SUM, b.STNM, b.STLC, b.ADMAUTH
    from RWDB.ST_PPTN_R r
    left join RWDB.ST_STBPRP_B b on r.STCD = b.STCD
    where r.TM >= (sysdate - interval '1' hour)
    group by r.STCD, b.STNM, b.STLC, b.ADMAUTH
    order by sum(r.DRP) desc
)
where rownum <= 40;

//2
select *
from (
    select r.STCD, sum(r.DRP) as DRP_SUM, b.STNM, b.STLC, b.ADMAUTH
    from RWDB.ST_PPTN_R r
    left join RWDB.ST_STBPRP_B b on r.STCD = b.STCD
    where r.TM >= (sysdate - interval '3' hour)
    group by r.STCD, b.STNM, b.STLC, b.ADMAUTH
    order by sum(r.DRP) desc
)
where rownum <= 40;

//3
select *
from (
    select r.STCD, sum(r.DRP) as DRP_SUM, b.STNM, b.STLC, b.ADMAUTH
    from RWDB.ST_PPTN_R r
    left join RWDB.ST_STBPRP_B b on r.STCD = b.STCD
    where r.TM >= (sysdate - interval '6' hour)
    group by r.STCD, b.STNM, b.STLC, b.ADMAUTH
    order by sum(r.DRP) desc
)
where rownum <= 40;

//4
select *
from (
    select r.STCD, sum(r.DRP) as DRP_SUM, b.STNM, b.STLC, b.ADMAUTH
    from RWDB.ST_PPTN_R r
    left join RWDB.ST_STBPRP_B b on r.STCD = b.STCD
    where r.TM >= (sysdate - interval '12' hour)
    group by r.STCD, b.STNM, b.STLC, b.ADMAUTH
    order by sum(r.DRP) desc
)
where rownum <= 40;

//5
select *
from (
    select r.STCD, sum(r.DRP) as DRP_SUM, b.STNM, b.STLC, b.ADMAUTH
    from RWDB.ST_PPTN_R r
    left join RWDB.ST_STBPRP_B b on r.STCD = b.STCD
    where r.TM >= (sysdate - interval '24' hour)
    group by r.STCD, b.STNM, b.STLC, b.ADMAUTH
    order by sum(r.DRP) desc
)
where rownum <= 40;


-- 第一题

select * from (
select r.STCD,sum(r.DRP) as DRP_SUM ,b.STNM,b.STLC,b.ADMAUTH 
from RWDB.dbo.ST_PPTN_R r 
left join RWDB.dbo.ST_STBPRP_B b on r.STCD=b.STCD 
where r.TM >= sysdate - interval '1'
group by r.STCD,b.STNM,b.STLC,b.ADMAUTH 
order by sum(r.DRP) desc) t where RN<41

-- 第二题

select * from (
select r.STCD,sum(r.DRP) as DRP_SUM ,b.STNM,b.STLC,b.ADMAUTH 
from RWDB.dbo.ST_PPTN_R r 
left join RWDB.dbo.ST_STBPRP_B b 
on r.STCD=b.STCD where r.TM >= sysdate - interval '7'
group by r.STCD,b.STNM,b.STLC,b.ADMAUTH 
order by sum(r.DRP) desc
) t where RN<41

-- 第三题

select * from (
select r.STCD,sum(r.DRP) as DRP_SUM ,b.STNM,b.STLC,b.ADMAUTH
 from RWDB.dbo.ST_PPTN_R r 
 left join RWDB.dbo.ST_STBPRP_B b on r.STCD=b.STCD 
 where r.TM >= sysdate - interval '6' 
 group by r.STCD,b.STNM,b.STLC,b.ADMAUTH 
 order by sum(r.DRP) desc
) t where RN<41

-- 第四题

select * from (
select r.STCD,sum(r.DRP) as DRP_SUM ,b.STNM,b.STLC,b.ADMAUTH 
from RWDB.dbo.ST_PPTN_R r 
left join RWDB.dbo.ST_STBPRP_B b on r.STCD=b.STCD 
where r.TM >= sysdate - interval '12' 
group by r.STCD,b.STNM,b.STLC,b.ADMAUTH order by sum(r.DRP) desc
) t where RN<41

-- 第五题
select * from (
select r.STCD,sum(r.DRP) as DRP_SUM ,b.STNM,b.STLC,b.ADMAUTH 
from RWDB.dbo.ST_PPTN_R r 
left join RWDB.dbo.ST_STBPRP_B b on r.STCD=b.STCD 
where r.TM >= sysdate - interval '24'  
group by r.STCD,b.STNM,b.STLC,b.ADMAUTH 
order by sum(r.DRP) desc
) t where RN<41

给你举几个例子,差异,可以参考下

SQL中,数据类型主要有整数、字符、日期/时间和二进制等。而在Oracle中,数据类型较多,包括NUMBER、VARCHAR2、DATETIMESTAMP、BLOB等。因此,在将SQL代码转换为Oracle时,需将SQL中的数据类型转换为Oracle支持的数据类型。

例如:

SQL代码中的整数类型将转换为Oracle的NUMBER类型。
SQL代码中的字符类型将转换为Oracle的VARCHAR2类型。
SQL代码中的日期/时间类型将转换为Oracle的DATETIMESTAMP类型。
SQL代码中的二进制类型将转换为Oracle的BLOB类型。
SQL中的关键字和函数
SQL中的关键字和函数在Oracle中也有相应的关键字和函数。但是,Oracle中的关键字和函数可能具有不同的语法和功能。在将SQL代码转换为Oracle代码时,需要注意这些差异。

例如:

SQL代码中的TOP关键字,转换为Oracle的SQL语句中,使用ROWNUM关键字。
SQL代码中的日期函数,转换为Oracle的SQL语句中,使用TO_DATE函数。
SQL代码中使用的聚合函数(如SUM、COUNT、AVG等)在Oracle中保持不变。
数据库对象的转换
在SQL中,数据库对象主要包括表、视图、过程和触发器等。而在Oracle中,数据库对象也有相应的类型,它们的语法和功能也有所不同。因此,在将SQL代码转换为Oracle代码时,需要将其中涉及的数据库对象进行转换。

例如:

SQL代码中的表将转换为Oracle的表,并且Oracle支持更多的表设计选项,比如分区表和IOT表等。
SQL代码中的视图将转换为Oracle的视图,并且Oracle支持更多的视图设计选项,比如可更新视图。
在Oracle中,过程和触发器需要使用PL/SQL语言编写,与在SQL Server或MySQL中的编写方式有很大的不同。
数据库连接的转换
在SQL中,连接两个或多个表的主要方法是使用JOIN。而在Oracle中,JOIN也是一种连接表的方法,但Oracle还提供了更多的连接选项。

例如:

在SQL中使用的INNER JOIN,在Oracle中也可以使用,不过Oracle也支持左外、右外和全外连接。
在Oracle中,还可以使用子查询作为连接两个或多个表的方法。
SQL代码执行计划的转换
SQL代码执行计划是一个非常重要的概念,它描述了数据库引擎执行SQL查询或DML语句的方式。在SQL Server和Oracle等数据库中,执行计划的产生方式和呈现方式都有所不同。

在将SQL代码转换为Oracle代码时,生成的执行计划可能会与SQL Server中的执行计划有所不同。因此,在进行转换之前,必须仔细分析SQL代码和Oracle所使用的执行计划生成方法,以便在转换过程中优化执行计划。

sql语句转Oracle语句,首先需要注意数据类型,SQL和Oracle支持的数据类型是有差别的,因此,需将SQL中的数据类型转换为Oracle支持的数据类型,比如SQL中的整数类型,对应为Oracle的NUMBER类型,字符类型将对应为Oracle的VARCHAR2类型等。其次要注意两者使用的关键字是有区别的,比如你现在的SQL语句中使用了很多top关键字,但是在Oracle中使用的是ROWNUM关键字。

转换时,注意sql与Oracle之间语法的差异,针对性修改过来就可以了