前提・実現したいこと
perl,MySQLのシステム環境です。
全く同じテーブル構造のテーブルが2つあります。
同じkeyで2つのテーブルの全カラムを比較し、異なっている場合に更新をしたいです。
例えば
TableA.名前
TableA.名前カナ
TableA.住所
TableB.名前
TableB.名前カナ
TableB.住所
TableA.名前とTableB.名前を比較し、異なっていたら、TableA.名前をTableB.名前に更新したいです。
1つのsqlで実現する方法がありましたらご教示いただけますでしょうか?
TableAを読み、同じkeyでTableBを抽出し、比較できるのは理解できています。
select文を2回発行するので、1つのselectまたはupdate文を教えていただきたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
まずは正規化についてどこまで理解されているかによります
tableAに対してtableBの相関関係が何をキーに成立するかがポイント
通常はレコードを確定させるためにはプライマリーキーを設定し
tableA、Bにともにプライマリーキーをもとに連結しますが
プライマリーキー以外の適当なユニークなidを設定することでも
対応は可能でしょう。
今回のケースであれば名前が変動があるという場合大きく2つのケースが考えられえます
- 一つは、名前自体が変更になる
- もう一つは、特定のタスクに対してリソースが変更になる(平たく言えば担当がえ)
前者の場合はtableA、Bには変動をしないuserIDを埋め込んでおき
別途tableC=ユーザーマスターを利用してユーザーの個人情報を管理すべきです
後者の場合は担当が変更になるものをtableAからBに連動するのは
ややおかしな処理なので実際にはtaskIDを利用してtableA、BではtaskIDを利用
タスクテーブルに対するユーザー情報を利用すればよいでしょう
(マスターで管理するという意味では前者も後者もほぼ処理は同じですが
ロジックが全く異なります)
投稿2018/03/22 00:26
総合スコア114572
0
ベストアンサー
同じkeyで全項目相違があれば更新するということでしょうか?
そうであれば、
[update]
SQL
1UPDATE TableA 2INNER JOIN TableB ON TableA.キー = TableB.キー 3SET TableA.名前 = TableB.名前, ~
※where条件なし。
構造が同じですべての内容を揃えるなら、delete+insertの方が、
項目を指定しないで良い分簡潔な記述で済みます。
以下は対象のkeyを一時テーブルとして作成し利用しています。
[delete + insert]
SQL
1create temporary table target_key 2select key from TableA as A 3where exists(select 1 from TableB where key=A.key) 4; 5 6delete from TableA 7where key in (select key from target_key) 8; 9 10insert into TableA 11select * from TableB 12where key in (select key from target_key) 13;
※一時テーブルを作成するには、CREATE TEMPORARY TABLE権限が必要です。
権限がない場合には、通常のテーブルで作成し、最後にdropします。
投稿2018/03/21 10:36
総合スコア25138
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/21 11:58
2018/03/22 00:32 編集
2018/03/25 02:01
0
2つのテーブルをJOINした上でUPDATEすればいけそうな気がします。試してみてください。
SQL
1UPDATE TableA 2INNER JOIN TableB ON TableA.キー = TableB.キー 3SET TableA.名前 = TableB.名前 4WHERE TableA.名前 != TableB.名前
投稿2018/03/21 09:00
総合スコア767
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。