2

次の列のようなテーブルがあります:bad_mrn、good_mrn、cr_date

insert into mrn_merge values ( '00000001','00000002', '20121120');
insert into mrn_merge values ( '00000002','00000003', '20121120');
insert into mrn_merge values ( '00000003','00000004', '20121120');

だから結局は。
-1が
2にマージされました-2が3に
マージされました-3が4にマージされました

1、2、3、または4の入力パラメーターを指定すると、4を返すクエリが必要です。次のプリペアドステートメントは機能しますが、mrn_mergeテーブルに40kレコードが含まれるようになると時間がかかります。

SELECT *
FROM
   (SELECT good_mrn, LEVEL
    FROM mrn_merge
    WHERE 
        (CONNECT_BY_ROOT bad_mrn =
            (SELECT bad_mrn FROM mrn_merge WHERE LEVEL =
                (SELECT MAX (LEVEL) FROM mrn_merge  START WITH good_mrn = ?
                 CONNECT BY PRIOR bad_mrn = good_mrn )
             START WITH good_mrn = ?
             CONNECT BY PRIOR bad_mrn = good_mrn)
        )  OR ( CONNECT_BY_ROOT bad_mrn = ?)
    START WITH  bad_mrn NOT IN ( SELECT good_mrn FROM mrn_merge  )
    CONNECT BY bad_mrn = PRIOR good_mrn  ORDER BY LEVEL DESC)
WHERE ROWNUM = 1 ;

SQLチューニングアドバイザは、「NOTIN」の代わりに「NOTEXISTS」を使用すると言いますが、ORA-00920:無効な関係演算子00920を取得します。00000-「無効な関係演算子」。

提供された助けに感謝します。

4

2 に答える 2

2

NOT IN単純に交換することはできませんNOT EXISTS

NOT INサブクエリの結果に対して列 (または括弧で囲まれた列のセット) をテストします。サブクエリは同じ数の列を返す必要があります。

SELECT a.cols
FROM table_a a
WHERE a.id NOT IN (
  SELECT b.id
  FROM table_b b
)

また

SELECT a.cols
FROM table_a a
WHERE (a.id, a.name) NOT IN (
  SELECT b.id, b.name
  FROM table_b b
)

NOT EXISTSサブクエリが 0 行 (TRUE) を返すか、1 つ以上の行 (FALSE) を返すかをテストします。通常、サブクエリは外側のクエリに関連付けられます。つまり、サブクエリ内の列 (または列のセット) は、外側のクエリの列 (または列のセット) に対してテストされます。

SELECT a.cols
FROM table_a a
WHERE NOT EXISTS (
  SELECT 1
  FROM table_b b
  WHERE b.id = a.id
)

あなたの特定の例では、節を合理的に書き直して use にできるようには思えませんNOT EXISTS

于 2012-11-27T17:59:43.240 に答える
0

誰かがこれを見てくれたらありがとう..しかし、私のDBAはこのクエリを手伝うために私を圧迫することができました..答えはそれをよりシンプルで効率的にすることでした..

から good_mrn を選択します ( mrn_merge から good_mrn、CONNECT_BY_ROOT bad_mrn、cr_date、bad_mrn を選択します
good_mrn= ? または bad_mrn=? で開始します
bad_mrn = 前の good_mrn で接続します) ここで、good_mrn は含まれません
(mrn_merge から bad_mrn を選択します) および rownum <=1;

今では非常に効率的に実行されます。ありがとう..

于 2012-11-28T14:11:00.090 に答える