私はこの質問を2つの部分からなる質問に変えました。
自己結合のロジックを理解しようとしていますが、何らかの理由で、ここに到達する必要があると思う行の2倍の行を取得し、その理由がわかりません。
また、結果に余分な行が表示されないようにクエリを修正する必要があります
テーブルにはユーザー入力エラーがあり、新しいID2の開始日は古いID2の終了日の翌日である必要があります。
テーブルは:
ID | BeginDate | EndDate | ID2
1 | 2000-01-01 | | TEN
1 | 2000-01-01 |2010-01-01 | ONEHUNDRED
2 | 2000-01-01 |2011-11-11 | TWENTY
2 | 2011-11-12 | | TWOHUNDRED
3 | 2000-01-01 | | THIRTY
BeginDateが更新されるべきであったが、更新されていない行を公開する自己結合を実行する必要があります。したがって、上記の場合、ID1の行のみが表示されます。
IDごとに1つの正しいID2を取得する必要があるクエリもあります。テーブルエラーは、正しいものだけが必要な場合にID=1である2つのID2を返します。クエリは以下のとおりです。
SELECT ID2
FROM TABLE1
WHERE inDate BETWEEN BeginDate AND NVL(EndDate, SYSDATE);
私はこのSELECTID2FROM TABLE1 WHERE inDate BETWEEN BeginDate AND NVL(MAX(EndDate)、SYSDATE);のようなものを試しました。
しかし、MAXは明らかにwhere句では機能しません。
以下のようなエラーを明らかにするために、すべての自己結合が各側の行を返します。
SELECT v.*
FROM Table1 v INNER JOIN Table1 v2
ON v.ID = v2.ID
AND v.BeginDate = v2.BeginDate
AND v.ID2 != v2.ID2
セルフジョインがどのように機能するかという点を見逃していると思います。
OracleはNullとの比較を行わないため、nullの終了日を比較することはできないと思います。
自己結合の片側からの行のみを表示するために、自己結合でTable1で何を比較する必要があるかについて誰かが洞察を持っていますか?
ありがとう