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

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

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

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

Q&A

3回答

2923閲覧

postgresql update select

amaguri

総合スコア227

PostgreSQL

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

0グッド

0クリップ

投稿2017/01/25 04:43

編集2017/01/25 05:41

updateにて
select文で検索した結果を更新したいのですが

テーブル名 dataテーブル
変更したいカラム名 flg

update テーブル名 set テーブル.カラム名=値 where 条件

今回反映させたいselect文

select t1.* from data t1 join (select pgp_sym_decrypt(card_no,pass) as b_card_no, max(ymd) from data where flg='0' group by 1 )t2 on pgp_sym_decrypt(t1.card_no,pass)=b_card_no and t1.ymd=t2.ymd and flg="0"

にて取得したデータ一覧のフラグを全て1に変更したいのですが

どのように組み合わせればできますでしょうか?

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

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

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

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

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

guest

回答3

0

dataテーブルに主キーが存在しているならば、where句でexistsを使用して、主キーがマッチするレコードを更新するようにすればよいかと思います。

update data t1_upd set flg = 1 where exists ( -- ここから元のSQL select 1 -- t1.*は取得する必要がないのでダミーで1をSELECTする from data t1 join (select pgp_sym_decrypt(card_no,pass) as b_card_no, max(ymd) from data where flg='0' group by 1 )t2 on pgp_sym_decrypt(t1.card_no,pass)=b_card_no and t1.ymd=t2.ymd and flg='0' -- ここまで元のSQL where t1_upd.(主キー) = t1.(主キー) );

投稿2017/01/25 05:29

makotribe

総合スコア217

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

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

amaguri

2017/01/25 06:13

いただいたコードを試してみたのですが undefind offset 1 と出てきてしまうのですがどうしたらよろしいでしょうか?
amaguri

2017/01/25 06:19

missing from clause entry for t1_upd と表示されてしまいます
amaguri

2017/01/25 06:20

おかげさまでundefind offsetは解決できました!
amaguri

2017/01/25 06:39

解決できてのですが動かないので見直したいと思います。
amaguri

2017/01/25 07:12

動いたのですか全部データが変更されてしまいます、、、
guest

0

まず、以下のSQLで期待通りのレコードが取得できているでしょうか。

select t1.(主キー) from data t1 join (select pgp_sym_decrypt(card_no,pass) as b_card_no, max(ymd) ymd from data where flg='0' group by 1 )t2 on pgp_sym_decrypt(t1.card_no,pass)=b_card_no and t1.ymd=t2.ymd and flg='0'

期待通りのレコードが取得できているならば、以下で同じレコードが更新されるはずです。
もし全て更新されるのであれば、「where t1_upd.(主キー) = t1.(主キー)」の部分でupdate句で指定したテーブル(t1_upd)とfrom句で指定したテーブル(t1)との比較になっていることを確認してみてください。

update data t1_upd set flg = 1 -- select t1.(主キー) from data t1 join (select pgp_sym_decrypt(card_no,pass) as b_card_no, max(ymd) ymd from data where flg='0' group by 1 )t2 on pgp_sym_decrypt(t1.card_no,pass)=b_card_no and t1.ymd=t2.ymd and flg='0' -- 主キーによる比較を追加 where t1_upd.(主キー) = t1.(主キー);

投稿2017/01/25 07:26

makotribe

総合スコア217

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

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

amaguri

2017/01/25 07:46

試しているのですが動かず終いで、、
amaguri

2017/01/25 07:46

最初のselect文は問題なく動いています。
amaguri

2017/01/25 07:47

-- select t1.(主キー) というところはなにも入らない ただのコメントという認識でよろしいでしょうか?
makotribe

2017/01/25 08:11

はい、その認識でけっこうです。
makotribe

2017/01/25 08:23

「最初のselect文は問題なく動いています。」とは、質問に記載された「今回反映させたいselect文」ですか? こちらは*が全角だったり、囲い文字に"(ダブルクォーテーション)が使われていたりといくつか正しくない点がありますが、もしそれが動いているのであれば「select t1.(主キー)~」のSQLもselectの部分のみ書き換えれば動くはずです。
guest

0

すみません、postgresqlのバージョンおよび設定によっては上記SQLではデフォルトではエラーとなってしまうようです。
※add_missing_fromの値がfalseの場合にエラーとなり、8.1以降でデフォルトでfalseとなっているようです。
SET add_missing_from TO trueとするか、以下に書き換えれば動くかと思いますがいかがでしょうか。

update data t1_upd set flg = 1 from data t1 join (select pgp_sym_decrypt(card_no,pass) as b_card_no, max(ymd) ymd from data where flg='0' group by 1 )t2 on pgp_sym_decrypt(t1.card_no,pass)=b_card_no and t1.ymd=t2.ymd and flg='0' where t1_upd.(主キー) = t1.(主キー);

投稿2017/01/25 06:58

makotribe

総合スコア217

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

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

amaguri

2017/01/25 07:40

主キーが暗号化されている場合は 復号化して 復号化されている主キー通しでの=で結べばいいという認識であっていますでしょうか?
makotribe

2017/01/25 07:48

同じテーブルの同じ項目を比較するので、暗号化されたままの比較でよいです。 復号化して比較する必要はないと思います。
amaguri

2017/01/25 08:07

なるほど いま 教えてもらった通りのコードで書いているですけど最初のは動いたのですが 二回めからの回答のものか動いてくれず エラー吐かれずで、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問