4

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
  );
4

1 に答える 1