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

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

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

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

SQL

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

Q&A

解決済

3回答

1130閲覧

テーブルの結合について

duster

総合スコア13

MySQL

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

SQL

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

0グッド

0クリップ

投稿2017/01/29 12:58

テーブルの結合について教えて下さい。

県テーブル
県コード 県名
1 A県
2 B県
3 C県

店テーブル
店コード 店名
1 A店
2 B屋

店舗数テーブル
県コード 店コード 店舗数
1 1 3
1 2 4
2 2 5

上記のテーブルを結合した場合の結果が、

県コード 店コード 店名 店舗数
1 1 A店 3
1 2 B店 4
2 1 A店 0
2 2 B店 5
3 1 A店 0
3 2 B店 0

上記のように、店舗数テーブルにレコードがない、
県テーブルの県コード’3’の情報も取得したいと考えております。

ご教授の程、よろしくお願い致します。

ツール:A5
言語:MySQL

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

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

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

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

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

guest

回答3

0

ベストアンサー

sql

1SELECT p.県コード, s.店コード, s.店名, IFNULL(nos.店舗数, 0) AS 店舗数 2FROM 県テーブル AS p 3INNER JOIN 店テーブル AS s 4LEFT OUTER JOIN 店舗数テーブル AS nos 5 ON p.県コード = nos.県コード AND s.店コード = nos.店コード 6ORDER BY 県コード, 店コード;

http://sqlfiddle.com/#!9/b51a5/1

ポイントは、県テーブル店テーブルを INNER JOIN する際に結合条件を指定しないことです。
https://dev.mysql.com/doc/refman/5.6/ja/join.html

結合条件が存在しない場合、INNER JOIN と , (カンマ) は意味的に同等です。どちらも、指定されたテーブル間のデカルト積を生成します (つまり、最初のテーブル内のすべての各行が 2 番目のテーブル内のすべての各行に結合されます)。

別解

上の SQL文の INNER JOIN は、CROSS JOIN に置き換えることもできます。

sql

1SELECT p.県コード, s.店コード, s.店名, IFNULL(nos.店舗数, 0) AS 店舗数 2FROM 県テーブル AS p 3CROSS JOIN 店テーブル AS s 4LEFT OUTER JOIN 店舗数テーブル AS nos 5 ON p.県コード = nos.県コード AND s.店コード = nos.店コード 6ORDER BY 県コード, 店コード;

http://sqlfiddle.com/#!9/b51a5/2

Panzer_vor様のコメントの通り、MySQLの場合は、どちらを使用しても結果は変わりません。
https://dev.mysql.com/doc/refman/5.6/ja/join.html

MySQL では、JOIN、CROSS JOIN、および INNER JOIN は構文上同等です (互いに置き換えることができます)。標準 SQL では、それらは同等ではありません。

投稿2017/01/29 14:27

編集2017/01/30 23:54
KiyoshiMotoki

総合スコア4791

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

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

duster

2017/01/29 14:35

ご回答ありがとうございます。 無事解決できました。 ポイントや考え方などもまとめて頂き、ありがとうございます。
Panzer_vor

2017/01/30 10:49

振る舞いは全く変わらないので好みの問題だったりしますが、当方の場合はデカルト積を作る場合はCROSS JOINを利用することが多いですね。 理由としては「結合条件の記載漏れでは?」と勘繰られたくないからですが。 まぁCROSS JOINの書き方をサポートしてないDBがあるのがポイントなので、INNER JOINの方が間違いはないといえば間違いないですが。
KiyoshiMotoki

2017/01/30 23:54

Panzer_vor様 コメントありがとうございます。 確かに、こちらの方が 「デカルト積を生成している」 ことが明確かもしれませんね。 別解として、回答に追記させていただきました。
Panzer_vor

2017/01/31 00:04

> KiyoshiMotokiさん 追記対応ありがとうございます。 プラス評価させていただきましたm(__)m
guest

0

select 県.県コード, 店.店コード, 店.店名, 店舗数.店舗数 from 県 left join 店舗数 on 県.県コード = 店舗数.県コード left join 店 on 店舗数.店コード = 店.店コード

外部結合です

投稿2017/01/29 13:26

yoppy0066

総合スコア293

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

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

duster

2017/01/29 14:16

ご回答ありがとうございます。 試してみましたがうまくいきません。 1 1 A店 3 1 2 B店 4 2 2 B店 5 3 null null null 上記のような結果になってしまいます。 実際とは違う、似せた例えの例題を使用し質問させて頂いているので、 例題の場合はそのような結果で間違いないと思います。 もう一度実際のテーブルを見直し、質問させて頂きます。
yoppy0066

2017/01/29 14:29

すみません。順番が間違っていました。こうですかね? select 県.県コード, 店.店コード, 店.店名, 店舗数.店舗数 from 店舗数 left join 店 on 店舗数.店コード = 店.店コード left join 県 on 県.県コード = 店舗数.県コード
duster

2017/01/29 14:38

ご回答ありがとうございます。 先ほどご回答頂いた方の方法(下記)でうまくいきました。 SELECT p.県コード, s.店コード, s.店名, IFNULL(nos.店舗数, 0) AS 店舗数 FROM 県テーブル AS p INNER JOIN 店テーブル AS s LEFT OUTER JOIN 店舗数テーブル AS nos ON p.県コード = nos.県コード AND s.店コード = nos.店コード ORDER BY 県コード, 店コード; 何度も考えて頂きありがとうございます。
guest

0

外部結合を使えば出来るよ

投稿2017/01/29 13:07

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

duster

2017/01/29 13:36

ご回答ありがとうございます。 外部結合を使用してみましたが、うまくいきません。 … from 県テーブル left outer join 店舗数テーブル on 県テーブル.県コード = 店舗数テーブル.県コード left outer join 店テーブル on 店テーブル.店コード = 店舗数テーブル.店コード 上記の記述で実行すると、 1 1 A店 3 1 2 B店 4 2 2 B店 5 3 null null null になります。 結合の順番がおかしいのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問