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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PostgreSQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

889閲覧

【SQL】外部結合でNULLの行が消えてしまう

shishi_maru440

総合スコア38

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PostgreSQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2022/11/08 13:22

編集2022/11/08 13:23

前提

MySQLを使用。

実現したいこと

外部結合にてstudent_nameごとにすべてのcredit_catを結合させたい。

発生している問題・エラーメッセージ

問題

外部結合を実施した際にすべてのcredit_catが存在しないstudent_nameにおいて
存在しないcredit_catが消えてしまう。(NULLにならない)
例)CreditsEarnedテーブルのBobはcredit_catはA, BのみでCがない。
外部結合をした際にBobのcredit_catのCはNULLであって欲しい。
(student_nameごとにcredit_catはA, B, Cが割り当てられて欲しい。)

該当のソースコード

SQL

1SELECT 2CR.student_name 3,CR.credit_cat 4FROM CreditsEarned AS CR 5RIGHT JOIN Categories AS CA 6ON CR.credit_cat = CA.credit_cat 7GROUP BY CR.student_name, CR.credit_cat 8;
CREATE TABLE Categories (credit_cat CHAR(1) NOT NULL, rqd_credits INTEGER NOT NULL); CREATE TABLE CreditsEarned --主キーなし (student_name CHAR(10) NOT NULL, credit_cat CHAR(1) NOT NULL, credits INTEGER NOT NULL); INSERT INTO Categories VALUES ('A', 10); INSERT INTO Categories VALUES ('B', 3); INSERT INTO Categories VALUES ('C', 5); INSERT INTO CreditsEarned VALUES ('Joe', 'A', 3), ('Joe', 'A', 2), ('Joe', 'A', 3), ('Joe', 'A', 3), ('Joe', 'B', 3), ('Joe', 'C', 3), ('Joe', 'C', 2), ('Joe', 'C', 3), ('Bob', 'A', 2), ('Bob', 'C', 2), ('Bob', 'A', 12), ('Bob', 'C', 4), ('John', 'A', 1), ('John', 'B', 1), ('Mary', 'A', 1), ('Mary', 'A', 1), ('Mary', 'A', 1), ('Mary', 'A', 1), ('Mary', 'A', 1), ('Mary', 'A', 1), ('Mary', 'A', 1), ('Mary', 'A', 1), ('Mary', 'A', 1), ('Mary', 'A', 1), ('Mary', 'A', 1), ('Mary', 'B', 1), ('Mary', 'B', 1), ('Mary', 'B', 1), ('Mary', 'B', 1), ('Mary', 'B', 1), ('Mary', 'B', 1), ('Mary', 'B', 1), ('Mary', 'C', 1), ('Mary', 'C', 1), ('Mary', 'C', 1), ('Mary', 'C', 1), ('Mary', 'C', 1), ('Mary', 'C', 1), ('Mary', 'C', 1), ('Mary', 'C', 1);
Bob A B C ------------------------------ joe A B C ------------------------------- John A B C ------------------------------ Mary A B C

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

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

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

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

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

guest

回答2

0

ベストアンサー

CreditsEarnedからstudent_nameの一覧を取得し、CategoriesとCROSS JOINしてstudent_nameとcredit_catの全組み合わせを作ります。
全組み合わせ側がすべて出力されるようにLEFT JOINを使って、例えばcreditsの合計を算出した結果と結合します。

SQL

1SELECT * FROM 2 ( 3 SELECT * FROM 4 (SELECT DISTINCT student_name FROM CreditsEarned) AS CR 5 CROSS JOIN 6 Categories AS CA 7 ) T1 8 LEFT JOIN 9 ( 10 SELECt student_name, credit_cat, SUM(credits) credits_sum 11 FROM CreditsEarned 12 GROUP BY student_name, credit_cat 13 ) T2 14 ON T1.student_name=T2.student_name AND 15 T1.credit_cat=T2.credit_cat 16

DB Fiddle

投稿2022/11/22 11:44

編集2022/11/22 12:04
etsuhisa

総合スコア416

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

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

0

JOINとUUTER OUTER JOINの違い を参考に。
混乱しにくいようにLEFTだけに限定してRIGHTは使わない、ってSQLルールのお客様も多いです。

投稿2022/11/08 21:31

編集2022/11/09 08:07
Orlofsky

総合スコア16415

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

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

YT0014

2022/11/09 07:40

リンクのタイトル部は、誤字(OUTER=>UUTER)だと思われますので、お手数ですが修正をお願いします。
shishi_maru440

2022/11/09 12:23

コメントありがとうございます。 BobにはCは存在しないのできないのは理解できました。 BobのCをNULLにするにはCASE式でなんとかするしかないでしょうか。
Orlofsky

2022/11/09 13:11

ちゃんと回答を読んでその内容を反映したSQLを実行しましたか? それを質問に追記してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問