繁体   English   中英

SQL Server:对Oracle(11g)而不是12c的前1个查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM