如何在Oracle中执行相关子查询,该查询返回基于ORDER BY
子句的第一个匹配行?我试图从SQL Server翻译这样做的查询。翻译回到顶端从SQL Server到Oracle的1个相关子查询
为了记录,我需要坚持(主要)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”:无效的标识符
但什么问题? 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
);
在[本文](http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1853075500346799932)中,Tom说:“ANSI SQL有表引用(相关名称)的范围仅限于一个级别“(我不知道如何解决您的问题,对不起)。 – Mat 2013-02-11 08:50:57
你为什么试图避免分析功能? – 2013-02-11 09:29:15
@Chris是否重要?这是我必须解决的问题。 – ErikE 2013-02-11 09:33:48