2012-01-26 22 views
9

グループの更新中にLINE_CDが50の場合にのみ、日付を更新するクエリを作成しようとしています。WHERE EXISTSを使用したSQL UPDATEステートメント

UPDATE EMPLOYER_ADDL 
SET EMPLOYER_ADDL.GTL_UW_APPRV_DT = EMPLOYER_ADDL.DNTL_UW_APPRV_DT 
WHERE EXISTS 
    ( 
     SELECT EMP_PLAN_LINE_INFO.LINE_CD 
     FROM EMP_PLAN_LINE_INFO 
     Where EMP_PLAN_LINE_INFO.GR_NBR = EMPLOYER_ADDL.GR_NBR and 
     EMP_PLAN_LINE_INFO.LINE_CD = 50 
    ) 
+5

はい............あなたは多くの "正しい答え" を持っている – JNK

+1

幸運のいずれかを選択しますそれら。 – SQLMason

+1

ありがとう、私は本当にそれをappriciate – user1152145

答えて

9

これはどうですか?

UPDATE EMPLOYER_ADDL 
SET EMPLOYER_ADDL.GTL_UW_APPRV_DT = EMPLOYER_ADDL.DNTL_UW_APPRV_DT 
WHERE EXISTS 
    ( 
     SELECT * 
     FROM EMP_PLAN_LINE_INFO 
     Where EMP_PLAN_LINE_INFO.GR_NBR = EMPLOYER_ADDL.GR_NBR and 
     EMP_PLAN_LINE_INFO.LINE_CD = 50 
    ) 

私ものUSING好む:私は存在すると信じて

UPDATE ea 
SET ea.GTL_UW_APPRV_DT = ea.DNTL_UW_APPRV_DT 
FROM EMPLOYER_ADDL ea 
    INNER JOIN EMP_PLAN_LINE_INFO ei ON(ei.GR_NBR = ea.GR_NBR) 
WHERE 
ei.LINE_CD = 50 
+1

この問題は、結合が重複を生成する場合(GR_NBRがEMPLOYER_ADDLまたはEMP_PLAN_LINE_INFOのいずれかで一意でない場合など)の追加作業です。両方のシナリオに対応しているため、EXISTS形式はより安全だと思います。 YMMV。 –

+1

GR_NBRはEPLIテーブルで一意ではありませんが、ADDLにあります。特別な作業をすると、クエリの実行に時間がかかりますか? – user1152145

12
UPDATE ea 
    SET GTL_UW_APPRV_DT = DNTL_UW_APPRV_DT 
    FROM EMPLOYER_ADDL AS ea 
    WHERE EXISTS 
    (
    SELECT 1 
     FROM EMP_PLAN_LINE_INFO AS ep 
     WHERE ep.GR_NBR = ea.GR_NBR 
     AND ep.LINE_CD = 50 
); 

クエリからこの情報を引き出すことができる場合は、なぜテーブルを更新しますか?このように、常に実行されなければならず、それ以外のリスクは時代遅れです。

+0

+1 - 絶え間ない更新の良い点。 – JNK

+2

列名を明示的に指定する必要があります。将来スキーマが変更されたらどうなるでしょうか?したがって、1の代わりに列名にする必要があります。 – Pankaj

+2

@StackOverflowUser - このインスタンスの場合は問題ありません。彼は 'EXISTS'が短絡し、実際にフィールドを返さないので' 1'を使用しています。私たちが知りたいのは、列が条件を満たしているかどうかです。 – JNK

6

私はこれがあなたに同じ結果をもたらすと信じています。

UPDATE ea 
    SET GTL_UW_APPRV_DT = DNTL_UW_APPRV_DT 
    FROM EMPLOYER_ADDL AS ea 
    INNER JOIN EMP_PLAN_LINE_INFO AS ep 
     ON ep.GR_NBR = ea.GR_NBR 
     AND ep.LINE_CD = 50 
+3

私は間違っていることを学ぶことができますので、downvoteの理由をしてください。 – AJP

+1

うわー、私たちは同じ答えを持っている、誰が投票したのだろうか。 – SQLMason

+1

それはすべて大きなゲームです。 – SQLMason

1

は、ワイルドカードが必要です。それは遅くなる可能性があると主張する人もいますが、2005年以降にSQLオプティマイザが見つかったのは、フィールドがnull以外のフィールドの場合は、INがEXISTSと同じ働きをするということです。

UPDATE EMPLOYER_ADDL 
SET EMPLOYER_ADDL.GTL_UW_APPRV_DT = EMPLOYER_ADDL.DNTL_UW_APPRV_DT 
WHERE EMPLOYER_ADDL.GR_NBR IN 
    ( 
     SELECT EMP_PLAN_LINE_INFO.GR_NBR 
     FROM EMP_PLAN_LINE_INFO 
     Where EMP_PLAN_LINE_INFO.LINE_CD = 50 
    ) 
+2

いいえ、 'EXISTS'はワイルドカードを必要としません。オプティマイザは列リストを完全に無視します。 –

+1

ポイントを獲得しました。私が今までに見た存在例はすべてワイルドカードを持っていますが、完全にテストしたことはありません。私はあなたの答えがちょうど選択1を行うことに気づいた。興味深い。 – Brain2000

+1

SQLのワイルドカードは%ではありません* – SQLMason

2

これも試してみてください。私はこれがあなたのために新しいと思いますか? GR_NBRはEMP_Plan_line_InfoでのPKと異なっていると仮定すると

UPDATE ADDL 
SET ADDL.GTL_UW_APPRV_DT = ADDL.DNTL_UW_APPRV_DT 
From EMPLOYER_ADDL ADDL 
Inner Join EMP_PLAN_LINE_INFO INFO on INFO.GR_NBR = ADDL.GR_NBR 
Where INFO.LINE_CD = 50 
+1

FROMなし、ADDLは必要ありません。 SET ADDL.GTL_UW_APPRV_DT = – SQLMason

+1

でそれはどうですか? :)それは私の側を静かに働いている... – Pankaj

+4

@DanAndrews個人的に、私は明示的に好む。エイリアスを 'SET'行に置くことにはどんな害がありますか?エイリアスが厳密に必要ではないことを認識していないコードを読んでいる同僚にとっては便利です。わかりやすいエイリアスを使用すると、コードをよりよく文書化するのに役立ちます。読みやすく理解するのは面倒ではありません。 –

4

UPDATE EA 
SET  GTL_UW_APPRV_DT = DNTL_UW_APPRV_DT 
FROM EMPLOYER_ADDL EA 
     INNER JOIN EMP_PLAN_LINE_INFO EP 
      ON EP.GR_NBR = EA.GR_NBR 
       AND EP.LINE_CD = 50