ORDER BY
句に基づいて最初に一致する行を返す Oracle で相関サブクエリを実行するにはどうすればよいですか? これを行う SQL Server からのクエリを変換しようとしています。
記録として、(ほとんど) SQL-92 構文に固執する必要があります。分析関数はまったく使用すべきではなく、非標準 SQL の使用を最小限に抑える必要があります。TOP 1 ... ORDER BY
は SQL Server 独自のものであり、それを に変換するのに苦労していrownum
ます。
注: この特定のクエリは必要ないことが指摘されています。これは、必要な列が 1 つだけでTOP/LIMIT/rownum
あるため、使用と意味的に同等であるためです。Min()
しかし、オラクルをよりよく学びたいので、述べられているように翻訳を実行する方法についての助けに感謝し、報います。
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
);