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

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

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

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

PostgreSQL

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

Q&A

解決済

1回答

1322閲覧

PK(主キー)で紐づけられたテーブルへのカラム・レコードの追加

guhi

総合スコア10

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

PostgreSQL

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

0グッド

0クリップ

投稿2021/12/22 23:06

編集2021/12/23 00:39

主キーを基にテーブルAにテーブルBの列・レコードを追加したいと考えています。

下図のイメージでテーブルを生成したく思い、ご教示いただければ、幸いです。
環境はpostgrespl(イントラマート)になります。

テーブルA              

主キーカラムAカラムB
001グループ1野菜

テーブルB

主キー行番号カラムC
001ごぼう
001ほうれん草

実現したい形(テーブルA)

|主キー|カラムA|カラムB|カラムD|カラムE|
|:--|:--:|:--:|--:|
|001|グループ1|野菜|ごぼう|ほうれん草|

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

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

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

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

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

hoshi-takanori

2021/12/22 23:31

これは難しいですね。テーブル B には同じ主キーのものが 2 件ずつ入ってるのでしょうか? また、その 2 件をどういう基準でカラム D と E に分けるのでしょうか?
guhi

2021/12/23 00:43 編集

ご連絡ありがとうございます。 >テーブル B には同じ主キーのものが 2 件ずつ入ってるのでしょうか 同じ主キーのものが2件入ります。 >また、その 2 件をどういう基準でカラム D と E に分けるのでしょうか? 実際にはテーブルBに行番号があり、行番号1がカラムD、行番号2がカラムEとなります。
guest

回答1

0

ベストアンサー

以下の様なSELECTを元に処理すればば良いかと思います。
カラムの並びを指定したい場合はarray_agg()(※9.21.集約関数)で指定します。
※行番号が1,2共に存在していることが前提です。(1の欠番が無い)

SQL

1with 2 tblA(主キー, カラムA, カラムB) as ( 3 values ('001','グループ1','野菜') 4 ), tblB(主キー, 行番号, カラムC) as ( 5 values ('001',1,'ごぼう'), ('001',2,'ほうれん草') 6 ) 7select ta.*, tb.カラムagg[1] as カラムD, tb.カラムagg[2] as カラムE 8from tblA ta 9 inner join ( 10 select 主キー, array_agg(カラムC order by 行番号) as カラムagg 11 from tblB 12 group by 主キー 13 ) tb 14 on ta.主キー=tb.主キー

with部分はテーブルA,Bの値を指定している部分ですので、実際には省いて下さい。

質問ではinsertになっていますが、テーブルAに対して行うなら、updateですね。

SQL

1update tblA tgt set 2 カラムD=src.カラムagg[1] 3, カラムE=src.カラムagg[2] 4from ( 5 select 主キー, array_agg(カラムC order by 行番号) as カラムagg 6 from tblB 7 group by 主キー 8 ) src 9where tgt.主キー=src.主キー

追加も更新も必要なら、insert into on conflict でupsertするのが効率良いかと思います。

投稿2021/12/23 00:05

編集2021/12/23 03:55
sazi

総合スコア25206

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

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

guhi

2021/12/23 08:24

アドバイスいただいた内容で実現できました。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問