トップ回答者
同一テーブルの更新について

質問
-
いつもお世話になっております。
梅崎と申します。
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文を追加し、
尚且つそれをレコードの数だけ繰り返すようなイメージを考えています。
お手数をお掛けいたしますがよろしくお願いします。
回答
-
検証する時間が今取れませんので、頭の中で思い付いた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/
-
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')
すべての返信
-
検証する時間が今取れませんので、頭の中で思い付いた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/
-
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')