質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

3回答

1187閲覧

MySQLでカラム比較

2wkm

総合スコア7

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

1クリップ

投稿2018/03/21 08:38

前提・実現したいこと

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

まずは正規化についてどこまで理解されているかによります
tableAに対してtableBの相関関係が何をキーに成立するかがポイント
通常はレコードを確定させるためにはプライマリーキーを設定し
tableA、Bにともにプライマリーキーをもとに連結しますが
プライマリーキー以外の適当なユニークなidを設定することでも
対応は可能でしょう。

今回のケースであれば名前が変動があるという場合大きく2つのケースが考えられえます

  • 一つは、名前自体が変更になる
  • もう一つは、特定のタスクに対してリソースが変更になる(平たく言えば担当がえ)

前者の場合はtableA、Bには変動をしないuserIDを埋め込んでおき
別途tableC=ユーザーマスターを利用してユーザーの個人情報を管理すべきです

後者の場合は担当が変更になるものをtableAからBに連動するのは
ややおかしな処理なので実際にはtaskIDを利用してtableA、BではtaskIDを利用
タスクテーブルに対するユーザー情報を利用すればよいでしょう

(マスターで管理するという意味では前者も後者もほぼ処理は同じですが
ロジックが全く異なります)

投稿2018/03/22 00:26

yambejp

総合スコア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

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

2wkm

2018/03/21 11:56

ご回答頂きありがとうございます。 言葉足らずで申し訳ありません。 TableAとTableBで40カラムあるのですが、TableAで変更になったカラムだけTableBへ反映したいというのが目的です。 例えば TableA.名前 → あああ TableA.名前カナ → アアア TableA.住所 → 東京都 TableB.名前 → いいい TableB.名前カナ → アアア TableB.住所 → 神奈川 となっている場合、TableBには TableB.名前 → あああ TableB.住所 → 東京都 の2つのカラムだけ更新したいのです。 名前カナは変更がないので、更新対象となります。 変更になったカラムだけ更新ということになりますので、 UPDATE TableA INNER JOIN TableB ON TableA.キー = TableB.キー SET TableA.名前 = TableB.名前 WHERE TableA.名前 != TableB.名前 UPDATE TableA INNER JOIN TableB ON TableA.キー = TableB.キー SET TableA.名前カナ = TableB.名前カナ WHERE TableA.名前カナ != TableB.名前カナ UPDATE TableA INNER JOIN TableB ON TableA.キー = TableB.キー SET TableA.住所 = TableB.住所 WHERE TableA.住所 != TableB.住所 というように40カラム全部に対して記述すると認識したのですが、違いますでしょうか? どのカラムが更新されたか把握したいという仕様なので、、、、
2wkm

2018/03/21 11:58

五月雨に申し訳ありません。 先ほどのコメントに誤りがありました。 (誤)名前カナは変更がないので、更新対象となります。 (正)名前カナは変更がないので、更新対象外となります。
sazi

2018/03/22 00:32 編集

>どのカラムが更新されたか把握したいという仕様 カラムごとのupdateを行うだけでは、どのkeyで更新されたかは分からないので、 把握したいというのなら、事前にチェックが必要だと思いますが。 チェックするなら、AとBをunionlしたものでKeyが重複しているものを取り出せば、何れかのカラムの値が異なっていることになります。 更新に関しては、変更がないものを更新したからといって特段問題は生じないと思いますけど、何か理由がありますか?
2wkm

2018/03/25 02:01

ご返信ありがとうございます。 変更がないものは更新してほしくないというのがお客様の要望なのですが 変更前カラム、変更後カラムをログテーブルに格納することでご了承いただくことにします。 上記で実装してみます。 いつもありがとうございます。
guest

0

2つのテーブルをJOINした上でUPDATEすればいけそうな気がします。試してみてください。

SQL

1UPDATE TableA 2INNER JOIN TableB ON TableA.キー = TableB.キー 3SET TableA.名前 = TableB.名前 4WHERE TableA.名前 != TableB.名前

投稿2018/03/21 09:00

bassbone

総合スコア767

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

2wkm

2018/03/21 09:03

早々にご回答頂き、誠にありがとうございます。 早速、明日、会社で試してみます。 取り急ぎ御礼まで
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問