SQL初心者です。試行錯誤しながらいじっているのですが下記ケースでうまい書き方がわからないためどなたかヒント等ご教示いただけると助かります。関連する2つの質問があります
◇環境:
MariaDB(5.5.68)環境
◇質問1
下記のテーブルAがあった時にBのように縦軸を名前、横軸をカテゴリ毎に種類を並べたいですが
どんなやり方があるでしょうか
テーブルA(入力):
Name Category Syurui
ーーーーーーーーーーーーーーーーーー
Aさん ラーメン 味噌
Bさん ラーメン 醤油
Cさん ラーメン 醤油
Dさん ラーメン 塩
Eさん ラーメン 味噌
Aさん お寿司 はまち
Bさん お寿司 いか
Cさん お寿司 まぐろ
Dさん お寿司 まぐろ
Eさん お寿司 たまご
Aさん ケーキ ショートケーキ
Bさん ケーキ モンブラン
Cさん ケーキ ショートケーキ
Dさん ケーキ チーズケーキ
Eさん ケーキ チーズケーキ
テーブルB(期待出力):
名前 ラーメン お寿司 ケーキ
ーーーーーーーーーーーーーーーーーーー
Aさん 味噌 はまち ショートケーキ
Bさん 醤油 いか モンブラン
Cさん 醤油 まぐろ ショートケーキ
Dさん 塩 まぐろ チーズケーキ
Eさん 味噌 たまご チーズケーキ
【やってみたこと1】
SELECT
CASE WHEN Category='ラーメン' THEN Syrui ELSE NULL END AS 'ラーメン'
CASE WHEN Category='お寿司' THEN Syrui ELSE NULL END AS 'お寿司'
CASE WHEN Category='ケーキ' THEN Syrui ELSE NULL END AS 'ケーキ'
FROM
A
→これで横に並べることはできたのですが、縦がAの行数のままとなってしまい冗長です
GroupBy等で行を縮退できないものかとも思ったのですがうまくいきませんでした。。
(結果は下記)
名前 ラーメン お寿司 ケーキ
ーーーーーーーーーーーーーーーーーーー
Aさん 味噌 NULL NULL
Bさん 醤油 NULL NULL
Cさん 醤油 NULL NULL
Dさん 塩 NULL NULL
Eさん 味噌 NULL NULL
Aさん NULL はまち NULL
Bさん NULL いか NULL
Cさん NULL まぐろ NULL
Dさん NULL まぐろ NULL
Eさん NULL たまご NULL
Aさん NULL NULL ショートケーキ
Bさん NULL NULL モンブラン
Cさん NULL NULL ショートケーキ
Dさん NULL NULL チーズケーキ
Eさん NULL NULL チーズケーキ
→縦が冗長
【やってみたこと2】
テーブルAをINNNER JOINで複数つなげ、WHERE句で各々「Category=’ラーメン’」などと絞る
→これで所望のテーブルBができることはできましたが、、、、
実際のテーブルAは、複数テーブルをINNNERJOINでつなぎ合わせた結果で作られているため
「テーブルAを作る部分の複数のコード」がxN回登場しており可読性が極めて悪いです
なにかほかにうまい記述方法はありますでしょうか
◇質問2
課題設定は1と同じなのですが、やってみたこと2を実行してみると、INNERJOINで
2つまでは直ぐに結果が返ってくる(1秒以内)のですが、3つつなげた時点で一気に遅くなり(2分程度)このままでは使い物にならない(さらにNを増やしたい)ため速度UPが期待できる書き方にしたいです
【やってみたこと】
今回のシチュエーションでは、「テーブルAを作る部分の複数のコード」が基本全く同じなので、
CREATE TEMPORARY TABLEで先頭でベーステーブル(SELECT出力をそのまま突っ込む)を作って、それを複数回利用する形にすれば 可読性、スピードともに速くなる(≒実際のテーブルAが複数テーブルのINNNERJOIN句で作られている部分が1回だけになるためことを期待)のではと思ったのですが、、 自分の環境では構文エラーとなってしまいます。デバッグのために超シンプルなテーブル、クエリと合わせてManual読み読みしながらやっても同じように構文エラーとなります。
→MariaDB(5.5.68)ではこのような使い方はサポート外だったりしますか?
→ほかに簡単な手法で高速化が図れそうなアイデアはないでしょうか
(インデックス利用というのは勉強中でまだよくわからないのと、テーブルAが複数テーブルから作られているので理解が追い付かなそうなので、それ以外の簡単なやり方でいい手があれば)
長々とすいません。詳しい方、ぜひアドバイスいただけたら幸いです
よろしくお願いいたします
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/02/18 07:07
2022/02/18 07:53 編集
2022/02/19 01:51