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

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

新規登録して質問してみよう
ただいま回答率
85.35%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

5495閲覧

SQLSERVER INNER JOINを用いたUPDATE文において複数回INNERJOINは使えないのか

tororon730

総合スコア1

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2020/07/16 05:46

編集2020/07/16 06:25

表題の件です。

最初の投稿ではミスが多数あり、本当に申し訳ございません。
修正させていただきます。

UPDATE TEAM

SQL

1SET NAME1 = a.TEAMNAME 2FROM TEAM 3INNER JOIN MASTER a 4 ON TEAM.NAME1 = a.ID

SQL

1UPDATE TEAM 2SET NAME2 = b.TEAMNAME 3FROM TEAM 4INNER JOIN MASTER b 5 ON TEAM.NAME2 = b.ID

はそれぞれ実行できますが、

SQL

1UPDATE TEAM 2SET NAME1 = a.TEAMNAME, NAME2 = b.TEAMNAME 3FROM TEAM 4INNER JOIN MASTER a 5on TEAM.NAME1 = a.ID 6INNER JOIN MASTER b 7on TEAM.NAME2 = b.ID

は0件実行しました、と表示されます。
エラーではないのですが、更新されません。

更新先のテーブルTEAMの2つのフィールドの値を元に、
MASTERのTEAMNAMEフィールドをそれぞれ呼び出し更新したいのです。

できるだけ実行回数を減らしたく思っているのですが、
まとめることはできないでしょうか?
素直に2回に分けるべきでしょうか。

どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

Orlofsky

2020/07/16 05:49

INNERJOIN ↓ INNER JOIN
sazi

2020/07/16 06:10

単独の1個目と2個目は同じ結果になると思いますが、それを纏める理由は何ですか?
tororon730

2020/07/16 06:17

多々修正点があり申し訳ございません。 対応次第、ご連絡させていただきます。
tororon730

2020/07/16 06:18

> sazi様 申し訳ございません、コードにミスがありました。 修正させていただきます。
tororon730

2020/07/16 06:24

取り急ぎ、1件目と2件目の修正をさせていただきました。
sazi

2020/07/16 06:29

本来名称が入るべきところ(NAME)にIDが入ってしまっているので補正したいという事ですか?
sazi

2020/07/16 06:40 編集

from 句を使用するならそれぞれのテーブルのプライマリーキーを明示して下さい。 (少なくともTEAMは必要)
tororon730

2020/07/16 06:42

>sazi様 ご認識の通りです。 プライマリーキーはどちらもNoというフィールドがあり、そちらを使用しています。 知識不足で申し訳ございません、このクエリにはプライマリーキーの使用が必要でしたでしょうか。
sazi

2020/07/16 06:54

from句で複数のテーブルを指定した場合、update対象のテーブルと結びつけなければなりませんので一意キーの情報が必要です。
sazi

2020/07/16 06:56 編集

それから、結合条件(NAME)を更新するようなクエリーなら、補正用途しか考えられませんが、どうなのですか?(認識通りというのが答え?)
Orlofsky

2020/07/17 04:12

1ヶ所しか直していない。涙
guest

回答2

0

ベストアンサー

補正が目的という事なので、取りあえず更新が行われれば良いと考えます。
ただ、無条件に更新してしまうと、突合できないものがNullになったりして、最初からやり直しになってしまいますから、更新対象が無い場合は値をそのまま残すようにcoalesce()を使用します。

SQL

1update team set 2 name1=coalesce((select teamname from master where id=team.name1), team.name1) 3, name2=coalesce((select teamname from master where id=team.name2), team.name2)

from句を使用する場合、from句で指定するのは編集元なのでupdateで指定するものとは別と考えて下さい。
なので、プライマリーキーを条件にする必要があり、以下では仮にそれをKeyとしています

SQL

1update team tgt set 2 name1=coalesce(a.teamname, tgt.name1) 3, name2=coalesce(b.teamname, tgt.name2) 4from team 5 left join master a 6 on team.name1=a.id 7 left join master b 8 on team.name2=b.id 9where tgt.key=team.key

投稿2020/07/16 07:10

編集2020/07/16 07:16
sazi

総合スコア25327

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

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

tororon730

2020/07/16 07:37

sazi様 coalesceというワードを初めて目にいたしました。 勉強不足、お恥ずかしい限りです。 ずっとINNER JOINを使わなくては行けない、と思いこんでいたようです。 無事にデータの更新ができました。 何度も返信をくださりありがとうございました。 ※from を使用する場合はプレイマリーキーが一致するテーブルのみ可能ということですね。 本当に勉強になりました。 もっと深くSQLの勉強していきたいと思います。
sazi

2020/07/16 07:42

> from を使用する場合はプレイマリーキーが一致するテーブルのみ可能ということですね。 いえ、そうではないです。 update対象に対して特定ができる条件であれば構いません。 今回の質問ではプライマリーキーが妥当という事です。
tororon730

2020/07/16 23:56

おお、またもや勘違いを・・・大変失礼いたしました。 なるほど。特定できる条件であれば大丈夫なのですね。 何度もご丁寧に回答してくださりありがとうございました。
guest

0

INNER JOIN が複数回 UPDATEに登場するのは問題ないのですが、
SET文まで複数登場してしまっています。(文法エラーにならないんですかね、これ)
複数列をUPDATEするときは、カンマでつないでください。

sql

1UPDATE TEAM 2SET NAME1 = a.TEAMNAME , NAME2 = b.TEAMNAME 3FROM TEAM 4INNER JOIN MASTER a 5ON TEAM.ID = a.ID 6INNER JOIN MASTER b 7ON TEAM.ID = b.ID;

と思ったんですが、これ、ぶつけてる先のテーブル(MASTER)が同じなんですね。
でしたら、以下でも同じ動きをするはずです。

sql

1UPDATE TEAM 2SET NAME1 = a.TEAMNAME , NAME2 = a.TEAMNAME 3FROM TEAM 4INNER JOIN MASTER a 5ON TEAM.ID = a.ID

投稿2020/07/16 05:59

YakumoSaki

総合スコア2027

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

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

tororon730

2020/07/16 06:16

お忙しい中、ご回答くださりありがとうございます。 カンマ、SETの複数回記載はこちらの記載ミスでした。 申し訳ございません。 また追加で記載ミスをしておりました。。本当に申し訳ございませんが 以下再度アドバイスいただけますでしょうか。 UPDATE TEAM SET NAME1 = a.TEAMNAME, NAME2 = b.TEAMNAME FROM TEAM INNER JOIN MASTER a on TEAM.NAME1 = a.ID INNER JOIN tl_matchTable b on TEAM.NAME2 = b.ID IDでJOINしているのではありませんでした。 それは別のテーブルでした。 ご迷惑をおかけし、申し訳ございません。 再度助力いただければ幸いです。
sazi

2020/07/16 07:14

updateのTEAMとfromのteamを結び付ける条件がないので、正しい更新はされないと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問