Sql server SQL Server:对Oracle的前1个查询(11g)而不是12c
下面是SQLServer中的一条SQL语句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 =
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的工作原理并得到意想不到的结果。谢谢您的回答!!