前提・実現したいこと
下記のような、あるキャラクタの各種別とその値を格納しているテーブルがあるとすると、これらの種別の全組み合わせをSQLで出力したいのですが、うまく行かなくて困っています。
types
| id | name | 
|---|---|
| 1 | 撃種 | 
| 2 | 属性 | 
| 3 | 戦型 | 
values
| id | type_id | value | 
|---|---|---|
| 1 | 1 | 反射 | 
| 2 | 1 | 貫通 | 
| 3 | 2 | 火 | 
| 4 | 2 | 水 | 
| 5 | 2 | 木 | 
| 6 | 2 | 光 | 
| 7 | 2 | 闇 | 
| 8 | 3 | パワー型 | 
| 9 | 3 | バランス型 | 
| 10 | 3 | スピード型 | 
| 11 | 3 | 砲撃型 | 
この2つのテーブルを使って下記のような全組み合わせ一覧を表示するSQLを作りたいです。
| no | pattern | 
|---|---|
| 1 | 撃種:反射,属性:火,戦型:パワー型 | 
| 2 | 撃種:反射,属性:火,戦型:バランス型 | 
| .. | ... | 
| 40 | 撃種:貫通,属性:闇,戦型:砲撃型 | 
撃種2種 × 属性5種 × 戦型4種 = 40レコード
使用するデータ
postgreSQLのインポート用のSQLのサンプルを載せておきます。
試しているバージョンは、9.5です。
sql
1CREATE TABLE types 2( 3 id SERIAL NOT NULL, 4 type VARCHAR 5); 6INSERT INTO types (type) VALUES ('撃種'),('属性'),('戦型'); 7CREATE TABLE values 8( 9 id SERIAL NOT NULL, 10 type_id INTEGER, 11 value VARCHAR 12); 13INSERT INTO values (type_id, value) VALUES 14(1,'反射'),(1,'貫通'), 15(2,'火'),(2,'水'),(2,'木'),(2,'光'),(2,'闇'), 16(3,'パワー型'),(3,'バランス型'),(3,'スピード型'),(3,'砲撃型');
試したこと
WITH RECURSIVEを使うとできるのではと思ったのですが、今のところできていません。
https://www.postgresql.jp/document/9.5/html/queries-with.html
また、下記のようにPL/pgSQLで実現しようとしてみたのですが、今のところできていません。
sql
1DO 2$$ 3DECLARE 4 r1 RECORD; 5 r2 RECORD; 6BEGIN 7 FOR r1 IN SELECT * FROM types LOOP 8 FOR r2 IN SELECT * FROM values WHERE type_id = r1.id LOOP 9 ... 10 END LOOP; 11 END LOOP; 12END; 13$$;
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/17 23:43
2021/08/18 03:56