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

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

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

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

Q&A

1回答

406閲覧

postgreSQLでの複数テーブルを使用したselect文について

python_k

総合スコア7

PostgreSQL

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

0グッド

0クリップ

投稿2022/05/06 04:29

編集2022/05/06 06:49

PostgreSQLの複数テーブルを使用したselct文について質問です。

table1
col1 | col2 | col3
A1 | B1 | test1
A2 | B2 | test2
A3 | B3 | test3

table2
id | A1 | A2 | A3 |date
1 | true |false|false | 2022-05-04
2 | false|true |true | 2022-05-05

table3
id | B1 | B2 | B3 | date
1 | 200 |300 |350 | 2022-05-04
2 | 100 |250 |400 | 2022-05-05

テーブルの定義は、
table1
col1 varchar(20)
col2 varchar(20)
col3 varchar(20)

table2
id int
B1 int
B2 int
B3 int
date date

table3
id int
B1 int
B2 int
B3 int
date date
となります。

selectで上記のtable1のcol1と一致するカラム名をtable2で見てtrueの場合のみ、table3からtable1のcol2と一致するカラム名の数値を以下のように表示したいです。

value | col3 | date
200 | test1 | 2022-05-04
250 | test2 | 2022-05-05
400 | test3 | 2022-05-05

ストアドやビューというものは調べてみたのですが、カラム名やテーブル名を変数で指定しようとするとうまくいきませんでした。
selectでこういった表示は可能なのでしょうか?

dateはtable2とtable3で同じ数値が入るのでtable2の方でお願いします。
またtable2,table3は今後カラム数が増える可能性があり、その際はtable1側にもデータが追加されます。
そのため可能であればA1,A2等を固定で指定するのではなく、table1のデータをそのままを使用したいです。
ストアド、ビューは現在削除してしまったため、以前のものが再現でき次第追記したいと思います。

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

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

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

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

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

takanaweb5

2022/05/06 06:21

結果のdate列はtable2とtable3のいずれの値を取得するのでしょうか?
m.ts10806

2022/05/06 06:30

>うまくいきませんでした。 実際のコードと起きている問題を記載されたほうが良いと思います。 あと、テーブル定義も提示してください。
sazi

2022/05/07 02:29

> table1のcol1と一致するカラム名をtable2で見てtrueの場合のみ 例でみると、table2は日付毎でtrue/falseが存在するようですが「trueの場合のみ」という条件をもう少し詳しく。
sazi

2022/05/07 02:32

> そのため可能であればA1,A2等を固定で指定するのではなく table2やtable3はカラム名なので、それも固定では無いという事ですか? 正規化を緩めすぎなので、動的SQLでしか対応できないと思います。
python_k

2022/05/09 00:56

table2は日付毎にtrueかfalseが付きます。 日付毎に各カラムがtrueかどうかを判断してtrueだったカラムのものを表示したいと考えています。 そのためtable2のA1がtrueの場合下記のように表示したいです。 value | col3 | date 200 | test1 | 2022-05-04 100 | test1 | 2022-05-05 250 | test2 | 2022-05-05 400 | test3 | 2022-05-05 table2、table3は今後カラムが増える可能性があるため、可能であれば固定で指定しない方法があればと考えています。 よろしくお願いします。
guest

回答1

0

下準備としてtable2 と table3 をunionを使って、以下のような表に変形させています。
table2

col1idvaluedate
A11true2022-05-04
A12false2022-05-05
A21false2022-05-04
A22true2022-05-05
A31false2022-05-04
A32true2022-05-05

table3

col2idvaluedate
B112002022-05-04
B121002022-05-05
B213002022-05-04
B222502022-05-05
B313502022-05-04
B324002022-05-05

sql

1CREATE TABLE Table1(col1 varchar(20), col2 varchar(20), col3 varchar(20)); 2INSERT INTO Table1(col1, col2, col3) 3VALUES 4 ('A1', 'B1', 'test1'), 5 ('A2', 'B2', 'test2'), 6 ('A3', 'B3', 'test3'); 7 8CREATE TABLE table2 (id int, A1 bool, A2 bool, A3 bool, date date); 9INSERT INTO table2(id, A1, A2, A3, date) 10VALUES 11 (1, true, false, false, '2022-05-04'), 12 (2, false, true, true, '2022-05-05'); 13 14CREATE TABLE table3 (id int, B1 int, B2 int, B3 int, date date); 15INSERT INTO table3(id, B1, B2, B3, date) 16VALUES 17 (1, 200, 300, 350, '2022-05-04'), 18 (2, 100, 250, 400, '2022-05-05');

sql

1with t2(col1, id, value, date) as( 2 select 'A1', id ,A1, date from table2 where A1=true 3union select 'A2', id ,A2, date from table2 where A2=true 4union select 'A3', id ,A3, date from table2 where A3=true 5), t3(col2, id, value, date) as( 6 select 'B1', id ,B1, date from table3 7union select 'B2', id ,B2, date from table3 8union select 'B3', id ,B3, date from table3 9) 10 11select 12 t3.value 13, t1.col3 14, t3.date 15from table1 as t1 16 left join t2 17 on t1.col1 = t2.col1 18 left join t3 19 on t2.id = t3.id 20 and t1.col2 = t3.col2

投稿2022/05/06 11:58

編集2022/05/06 12:00
takanaweb5

総合スコア358

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問