如何在 Oracle 中执行基于ORDER BY
子句返回第一个匹配行的相关子查询?我正在尝试从执行此操作的 SQL Server 转换查询。
作为记录,我需要坚持(大部分)SQL-92 语法。分析函数根本不应该用,我需要尽量减少非标准SQL的使用。TOP 1 ... ORDER BY
是 SQL Server 专有的,我正在努力将其转换为rownum
.
注意:已经指出,这个特定的查询不需要,TOP/LIMIT/rownum
因为它在语义上等同于使用Min()
,因为我们只想要一列。但我仍然会感激并奖励任何有关如何按所述执行翻译的帮助——因为我想更好地学习 Oracle。
这是 SQL Server 查询(以及它的 SqlFiddle):
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": 无效标识符
但问题是什么?子句中的相关子查询SELECT
应该可以访问所有外部表数据。我不知道下一步该去哪里。(以及用于此的 SqlFiddle)。
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
);