如何在Oracle中执行基于ORDER BY子句返回第一个匹配行的相关子查询?我正在尝试从执行此操作的SQL Server转换查询.

为了记录,我需要坚持(大多数)SQL-92语法.根本不应该使用分析函数,我需要尽量减少使用非标准SQL. TOP 1 … ORDER BY是SQL Server专有的,我正在努力将其翻译成rownum.

注意:已经指出这个特定查询不需要TOP / LIMIT / rownum,因为它在语义上等效于使用Min(),因为我们只需要一列.但我仍然会欣赏并且会奖励任何有关如何执行翻译的帮助 – 因为我想更好地学习Oracle.

这是SQL Server查询(和SqlFiddle for it):

SELECT

D.StartDate,

(

SELECT TOP 1 E.EndDate

FROM dbo.Dates E

WHERE

E.EndDate >= D.EndDate

AND NOT EXISTS (

SELECT *

FROM dbo.Dates E2

WHERE

E.StartDate < E2.StartDate

AND E.EndDate > E2.StartDate

)

ORDER BY

E.EndDate,

E.StartDate DESC

) EndDate

FROM

dbo.Dates D

WHERE

NOT EXISTS (

SELECT *

FROM dbo.Dates D2

WHERE

D.StartDate < D2.EndDate

AND D.EndDate > D2.EndDate

);

这就是我尝试过的.我受到了阻碍,因为我在D.EndDate外部参考上遇到错误.

ORA-00904: “D”.”ENDDATE”: invalid identifier

但是问题是什么? SELECT子句中的相关子查询应该可以访问所有外部表数据.我不知道下一步该往哪里去. (和the SqlFiddle for this).

SELECT

D.StartDate,

(

SELECT *

FROM (

SELECT E.EndDate

FROM Dates E

WHERE

E.EndDate >= D.EndDate

AND NOT EXISTS (

SELECT *

FROM Dates E2

WHERE

E.StartDate < E2.StartDate

AND E.EndDate > E2.StartDate

)

ORDER BY

E.EndDate,

E.StartDate DESC

)

WHERE rownum = 1

) EndDate

FROM

Dates D

WHERE

NOT EXISTS (

SELECT *

FROM Dates D2

WHERE

D.StartDate < D2.EndDate

AND D.EndDate > D2.EndDate

);

更多推荐