Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server:对Oracle的前1个查询(11g)而不是12c_Sql Server_Oracle_Oracle11g - Fatal编程技术网

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

Sql server SQL Server:对Oracle的前1个查询(11g)而不是12c,sql-server,oracle,oracle11g,Sql Server,Oracle,Oracle11g,下面是SQLServer中的一条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 =

下面是SQLServer中的一条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的查询?

首先,您需要将别名a添加到表PA0000中,以避免错误ORA-00904:a.FRSTUP:无效标识符。

使用rownum=1将选择一个随机值,该值与order by子句无关,而与磁盘上的块对齐方式无关

12c有这个fetchfirst{n}ROWS ONLY子句

在11.2及以下版本中,使用row_编号是最方便的方法

选择架构中创建的最新单个对象的示例:

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根据我对您的问题的理解,您可以使用level,connect by Previor获得结果,如下所示:

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; 

希望这将解决您的需求…

可能的重复您将获得关于如何在标记为重复的帖子中使用ROWNUM的完整答案。我制作了一个函数,使用execute immediate并将其应用于查询,谢谢各位。它不受限制,而是获取前n行。是的,你可以使用ROWNUM进行分页,看对了,我想到的是mysql。在我的生产环境中还没有任何12c。将使用rownum更新应答器,您必须知道如何正确使用它。我以前使用过它,但我发现对于不确定Oracle SQL或不熟悉Oracle SQL的人来说,行号更明确,更容易理解。很容易误解rownum的工作原理并得到意想不到的结果。谢谢您的回答!!