![](/img/trans.png)
[英]Oracle 11g query took almost 30min to finish but around 5 min in SQL Server
[英]SQL Server : Top 1 query to Oracle (11g) not 12c
这是SQL Server中的一条SQL语句
SELECT
a.EMPNUM,
(SELECT TOP 1 NAMEKO
FROM PA0001
WHERE COMPCD = a.COMPCD
AND EMPNUM = a.LASTUP
ORDER BY EDDATE DESC) AS LASTNM,
(SELECT TOP 1 NAMEKO
FROM PA0001
WHERE COMPCD = a.COMPCD
AND EMPNUM = a.FRSTUP
ORDER BY EDDATE DESC) AS FIRSNM
FROM PA0000 a
然后,我尝试将其应用于Oracle 11g(而不是支持top n查询的Oracle 12c)
SELECT
empnum,
(SELECT NAMEKO
FROM
(SELECT NAMEKO
FROM PA0001
WHERE COMPCD = a.COMPCD
AND EMPNUM = a.FRSTUP
ORDER BY EDDATE DESC)
WHERE ROWNUM = 1) AS FRSTNM,
(SELECT NAMEKO
FROM
(SELECT NAMEKO
FROM PA0001
WHERE COMPCD = a.COMPCD
AND EMPNUM = a.LASTUP
ORDER BY EDDATE DESC)
WHERE ROWNUM = 1) AS LASTNM
FROM PA0000 a
然后我得到一个错误
ORA-00904:“ A”。“ FRSTUP”:无效的标识符。
如何重写针对Oracle的查询?
首先,您需要向表PA0000
添加别名“ a”以避免错误ORA-00904: "A"."FRSTUP": invalid identifier.
使用rownum = 1将选择一个不依赖于order by子句的随机值(而不是如何在磁盘上对齐块)
12c具有此功能( FETCH FIRST {n} ROWS ONLY子句)
在11.2及更低版本中,使用row_number()是最方便的方法
选择在架构中创建的最新对象(单个)的示例:
select *
from (select user_objects.object_name,
user_objects.object_id,
user_objects.created,
row_number () over (order by user_objects.created desc) as rn
from user_objects) view_uo
where view_uo.rn = 1
查看最新的10个对象将是rn <= 10
然后只需修改它以包括您的选择。
根据我对您问题的理解,您可以通过使用level, connect by prior
来实现结果,按以下方式进行level, connect by prior
:
SELECT EMPNO FROM EMP WHERE HIREDATE IN
(SELECT MAX(HIREDATE) FROM EMP WHERE LEVEL<=1 CONNECT BY PRIOR HIREDATE>HIREDATE GROUP BY LEVEL) ORDER BY HIREDATE DESC;
希望这能解决您的要求...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.