none
同一テーブルの更新について RRS feed

  • 質問

  • いつもお世話になっております。
    梅崎と申します。

    SQLServerのUpdate構文について相談させてください。

    以下のような従業員情報テーブルがある場合、2014年4月3日のdept列の中身を2014年4月1日のdept列
    に上書きするクエリを作成したいと考えています。

    <T_Employee>
    employee_cd | date       | dept
    ---------------------------------------
        A000001 | 20140401  | 人事部
        A000001 | 20140402  | 営業部
        A000001 | 20140403  | 営業部
        A000002 | 20140401  | 人事部
        A000002 | 20140402  | 総務部
        A000002 | 20140403  | 総務部

    Update T_Employee
    set dept = ??
    where [date]= '20140403'

    4月1日と4月3日のレコードでemployee_cdが一致する場合、
    dept列を4月1日のdept列を書き換えたいのですが、何か良い
    方法があれば教えていただけないでしょうか。

    上記のset dept = のところで、更新する値が返るようなselect文を追加し、
    尚且つそれをレコードの数だけ繰り返すようなイメージを考えています。

    お手数をお掛けいたしますがよろしくお願いします。

    2014年4月17日 7:25

回答

  • 検証する時間が今取れませんので、頭の中で思い付いたSQLです。実行する際には十分に注意して下さい。
    申し訳ありません。

    update T_Employee set dept = t.dept 
    from (select t1.employee_cd, t1.dept from T_Employee t1 where t1.date = '20140403') t
    where T_Employee.date = '20140401' and T_Employee.employee_cd = t.employee_cd
    #(追記)動作確認しました。これで大丈夫だと思います。

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/



    • 編集済み trapemiya 2014年4月18日 2:45 追記
    • 回答の候補に設定 星 睦美 2014年4月22日 4:40
    • 回答としてマーク 梅崎 2014年4月23日 8:05
    2014年4月17日 9:28
  • FROM句 を用いたUPDATEは、結合対象データが複数件あった際にそのまま処理される(最初の1件で更新)点だけはご注意下さい。

    個人的には上記の点が好きになれないので使わない様にしています。
    見た目的にはFROM句を使った方が綺麗ですが、使わないパターンを載せておきます。

    UPDATE T_Employee
       SET dept = (SELECT SUB.dept FROM T_Employee AS SUB WHERE SUB.employee_cd = T_Employee.employee_cd AND SUB.date = '20140403')
     WHERE date = '20140401'
       AND EXISTS (SELECT SUB.dept FROM T_Employee AS SUB WHERE SUB.employee_cd = T_Employee.employee_cd AND SUB.date = '20140403')
    
    • 回答の候補に設定 星 睦美 2014年4月22日 4:40
    • 回答としてマーク 梅崎 2014年4月23日 8:07
    2014年4月20日 6:02

すべての返信

  • Update T_Employee set dept = ??
    where [date]='20140401' and
    employee_cd=(select a.employee_cd from T_Employee as a where a.date='20140403')

    こんな感じかな?

    2014年4月17日 8:51
  • 検証する時間が今取れませんので、頭の中で思い付いたSQLです。実行する際には十分に注意して下さい。
    申し訳ありません。

    update T_Employee set dept = t.dept 
    from (select t1.employee_cd, t1.dept from T_Employee t1 where t1.date = '20140403') t
    where T_Employee.date = '20140401' and T_Employee.employee_cd = t.employee_cd
    #(追記)動作確認しました。これで大丈夫だと思います。

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/



    • 編集済み trapemiya 2014年4月18日 2:45 追記
    • 回答の候補に設定 星 睦美 2014年4月22日 4:40
    • 回答としてマーク 梅崎 2014年4月23日 8:05
    2014年4月17日 9:28
  • FROM句 を用いたUPDATEは、結合対象データが複数件あった際にそのまま処理される(最初の1件で更新)点だけはご注意下さい。

    個人的には上記の点が好きになれないので使わない様にしています。
    見た目的にはFROM句を使った方が綺麗ですが、使わないパターンを載せておきます。

    UPDATE T_Employee
       SET dept = (SELECT SUB.dept FROM T_Employee AS SUB WHERE SUB.employee_cd = T_Employee.employee_cd AND SUB.date = '20140403')
     WHERE date = '20140401'
       AND EXISTS (SELECT SUB.dept FROM T_Employee AS SUB WHERE SUB.employee_cd = T_Employee.employee_cd AND SUB.date = '20140403')
    
    • 回答の候補に設定 星 睦美 2014年4月22日 4:40
    • 回答としてマーク 梅崎 2014年4月23日 8:07
    2014年4月20日 6:02
  • フォーラム オペレーターの星 睦美です。
    梅崎 さん、こんにちは。

    フォーラムの回答者からの返信がありますので、内容に疑問があれば引き続き返信をお願いします。
    回答者のはげみになりますので役立つ回答には投稿者から[回答としてマーク]いただければ嬉しいです。

    では今後ともSQL Server フォーラムをお役立てください。

    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2014年4月21日 5:10
  • フォーラム オペレーターの星 睦美です。
    梅崎 さん、こんにちは。

    私のほうで参考になりそうな回答だと思いましたので、[回答の候補に設定] させていただきました。
    コミュニティのユーザーからの返信が参考になりましたら、今後の回答の励みになりますので
    投稿者から[回答としてマーク] いただければ幸いです。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2014年4月22日 4:44
  • trapemiya殿

    梅崎です。ご返答ありがとうございます。

    返信が遅くなってしまい大変申し訳ございません。

    本日、検証環境上で、クエリを実行し、正常に動作することを確認できました。

    1つのテーブル内で、相互に参照しあう方法がわからなかったので大変たすかりました。

    ありがとうございます。

    2014年4月23日 8:06
  • trapemiya殿

    梅崎です。ご回答ありがとうございます。

    検証環境でためし、正常に動作することを確認しました。

    一つのテーブルを相互参照する方法がわからず苦慮しておりましたので、大変たすかりました。

    ありがとうございました。

    2014年4月23日 8:09