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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

1回答

206閲覧

postgrasqlのupdate時

shadowjun

総合スコア7

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2018/03/26 16:21

postgresql(9.3.6)(64bit)にてupdate文を実行しようとしていますが
update文でのsetはupdate対象のテーブルも含めるjoinをしたとき、
複数のレコードがヒットする場合は複数のレコードが個別に値がセットされるかどうか
(できる方法があるかどうか)を教えていただきたいと思いました。

できない場合は複数レコードupdateする方法も教えていただければ幸いです。
updateで基本はどうにかしようと考えていましたがわからなかったため
ここに投稿いたします。

※またjoinする理由としましては条件をwhereまたはonの結合部分で利用したいと思い
結合をしています。

○例
update テーブル1
set カラム1 = テーブル5.カラム1
from テーブル1 as TB1
left join テーブル2 on テーブル2.カラム外部キー(一意) = TB1.主キー
left join テーブル3 on テーブル3.カラム外部キー(一意) = テーブル2.主キー
left join テーブル4 on テーブル4.カラム外部キー(一意) = テーブル3.主キー
left join テーブル5 on テーブル5.カラム1 = テーブル4.カラム1
where
テーブル6.カラム2 = テーブル1.カラム1

以上です。

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

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

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

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

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

sazi

2018/03/26 16:41

テーブル6がいきなり出現していますが
shadowjun

2018/03/26 16:42

すみません、テーブル5の間違いでした。
guest

回答1

0

ベストアンサー

提示のSQLを別な書き方をすると、

SQL

1update テーブル1 2set カラム1 = ( 3 select テーブル5.カラム1 4 from テーブル1 as TB1 5 left join テーブル2 on テーブル2.カラム外部キー(一意) = TB1.主キー 6 left join テーブル3 on テーブル3.カラム外部キー(一意) = テーブル2.主キー 7 left join テーブル4 on テーブル4.カラム外部キー(一意) = テーブル3.主キー 8 left join テーブル5 on テーブル5.カラム1 = テーブル4.カラム1 9 where テーブル5.カラム2 = テーブル1.カラム1 10 )

上記のように、相関サブクエリーの結果をセットするようにも書けます。
この時サブクエリーが返す結果が更新の行に対して複数行返却されるものはNGです。
更新先:更新元=n:1 でなければなりません。
質問の書き方であっても同じ状態ならNGです。(結果を特定できない)

正常に更新させるためには、更新元の状態をgroup by やdistinctなどで集約した結果にすることです。

投稿2018/03/26 16:52

編集2018/03/26 17:22
sazi

総合スコア25173

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

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

shadowjun

2018/03/26 17:00

ご回答ありがとうございます。 おっしゃっていることは、from・joinを利用したSQLの結果が複数行の場合はNG(上手くアップデートが行われない)ということでしょうか。 やはりupdateをする場合は利用している言語などでfor文などを利用する必要があるということでしょうか。
sazi

2018/03/26 17:05 編集

テーブル1とfrom句で指定している内容が、1:nになっているなら、1:1になるように集約する必要があります。 更新したいのは上記nの何れかの値であれば良いというような更新なんですか?
shadowjun

2018/03/26 17:10

多数あるなかの1件ではなくヒットした全てと考えていました(多 対 多)。 無理ということですよね?
sazi

2018/03/26 17:12

無理です。 無理以前にそんなランダムな更新されても嬉しくないでしょう?
shadowjun

2018/03/26 17:16

無理なのは理解できましたが、なぜランダムに更新されてしまう可能性を考えることができるのかに 疑問が浮かびました。updateに関しての知識が足りていないかもしれないです。 そのあたりは勉強してみます。 素早いご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問