0

私はこの質問を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で何を比較する必要があるかについて誰かが洞察を持っていますか?

ありがとう

4

3 に答える 3

1

予想される行数を取得するには、次のように変更v.ID2 != v2.ID2します。v.ID2 < v2.ID2

于 2012-08-15T22:14:53.493 に答える
1

idとに一意のキーがないため、次のように出力begin_dateすることができます。distinct

SELECT DISTINCT v.*
  FROM Table1 v INNER JOIN Table1 v2
    ON v.ID = v2.ID
   AND v.BeginDate = v2.BeginDate
   AND v.ID2 != v2.ID2;

または

SELECT DISTINCT v.*
  FROM Table1 v , Table1 v2
 WHERE v.ID = v2.ID
   AND v.BeginDate = v2.BeginDate
   AND v.ID2 != v2.ID2;
于 2012-08-15T22:52:04.407 に答える
0

この種の自己結合は、numrows*numrowsレコードを提供します。しかし、あなたはそれをさらなるルールで制限します。nullと比較すると、常にfalseが返されますが、機能します。

合計numrows*numrows-numrows-nullsである必要があります。

于 2012-08-15T22:12:41.670 に答える