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

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

新規登録して質問してみよう
ただいま回答率
86.02%
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

解決済

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

shishi_maru440
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に必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

2回答

0グッド

0クリップ

277閲覧

投稿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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答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

総合スコア16250

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

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を実行しましたか? それを質問に追記してください。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

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に必要なデータを格納できます。また、格納したデータを引き出すことも可能です。