0

ネストされた両方のクエリが非常に似ているため、このスクリプトをどのようにリファクタリングできるか疑問に思っていました (データベースに ORACLE を使用しています)。

  UPDATE
  ALERT alert
  SET
    VERIFICATION_COUNT =
      (
        SELECT COUNT(*)
        FROM TRANSCRIPTION trans
        INNER JOIN DOS dos
        ON trans.REF_NO = dos.REF_NO
        WHERE trans.STATUS = 'ONGOING'
        AND alert.VISIT = dos.VISIT
      )
  WHERE
      alert.VISIT = 
      (
        SELECT DISTINCT dos.VISIT FROM TRANSCRIPTION trans
        INNER JOIN DOS dos
        ON trans.REF_NO = dos.REF_NO
        WHERE trans.STATUS = 'ONGOING'
        AND alert.VISIT = dos.VISIT
      );
4

1 に答える 1

0

これを試して:

merge into alert A
using (
    select D.visit, count(*) as visit_count
    from transcription T
        join dos D on D.ref_no = T.ref_no
    where T.status = 'ONGOING'
    group by D.visit
) X
on ( A.visit = X.visit )
when matched then
    update
    set A.verification_count = X.visit_count
;

ただし、元の機能とまったく同じであるとは限りません。:-) これは、スカラー サブクエリではなく結果セットに対して等値演算子が使用されるため、外部キーの関係を知らなければ、元の WHERE 句が何をするのか少し混乱するためです。

于 2014-06-04T11:14:08.087 に答える