teratail header banner
teratail header banner
質問するログイン新規登録
MySQL

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

SQL

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

Q&A

解決済

2回答

269閲覧

SQLの外部結合で元テーブル全てに対して第3テーブルから1行だけレコードを引っ張って来たい(MySQL)

TakefumiSAITOH

総合スコア10

MySQL

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

SQL

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

0グッド

0クリップ

投稿2025/06/25 14:39

編集2025/06/25 14:54

0

0

実現したいこと

3つのテーブルがあるとします。(実際はもっと沢山あります)左外部結合のSQLを書いて、Javaで処理するためのデータを抽出したいのですが・・・

(第1テーブル)「企業名」
取引コード  企業名
123451   株式会社A
123452   株式会社B
123453   株式会社C

(第2テーブル)「指定取引手法」
取引コード  決済手段
123451   現金決済
123452   カード決済
102321   Edy決済

(第3テーブル)「取引手法」
取引コード  決済手段
123451   現金決済
123452   カード決済
123453   PayPay決済
102321   Edy決済

この3つのテーブルを、外部結合で並べたいのですが、「第1」と「第2」は「取引コード」で繋いで、
(結合例1)
取引コード  企業名   決済手段(第2)
123451   株式会社A  現金決済
123452   株式会社B  カード決済
123453   株式会社C  null

と出来ます。

ここに第3テーブルを繋いで、「取引コード上5桁」同士が一致するものの中から、最小のものを抽出しろ、と言われているのですが、どのようにSQLを書けば良いかいまいちわからないです。要は、、、
(結合例2)
取引コード  企業名   決済手段(第2)  決済手段(第3)
123451   株式会社A  現金決済   現金決済
123452   株式会社B  カード決済  現金決済
123453   株式会社C  null     現金決済

という形になれば良いようです。

発生している問題・分からないこと

結合例2を1本のSQLで抜けるものかどうかを知りたいです。

該当のソースコード

SQL

1select1.取引コード,1.企業名,2.決済手段 2from1テーブル as1 3left outer join2テーブル as2 on1.取引コード =2.取引コード

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

「外部結合」「多対1」等で検索しましたが、いまいちピンとくるものは見つかりませんでした。

補足

特になし

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

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

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

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

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

YT0014

2025/06/25 15:27

sql left-join 複数 の検索で、サンプルSQL掲載ページが複数ヒットしましたので、お試しください
yambejp

2025/06/26 00:16

第3テーブルの結合条件の「最小のものを抽出」という定義があいまいで何をしたいかわかりません。
guest

回答2

0

ベストアンサー

「取引コード上5桁」同士が一致するものの中から、最小のものを抽出しろ

取引コードの上5桁のうち、取引コードが最小のものを優先するという認識でよいでしょうか?

例: 「取引手法」のサンプルでは123451、123452、123453について上5桁が一致するので、123451/現金決済を採用する。

この認識で正しいのであれば、SQLは以下のようになるかと思います。

SQL

1SELECT 2 企業名.取引コード, 3 企業名.企業名, 4 指定取引手法.決済手段 AS 決済手段_第2, 5 優先度付き取引手法.決済手段 AS 決済手段_第3 6FROM 企業名 7LEFT OUTER JOIN 指定取引手法 ON 企業名.取引コード = 指定取引手法.取引コード 8LEFT OUTER JOIN ( 9 SELECT 10 SUBSTR(取引コード, 1, 5) AS 取引コード5, 11 ROW_NUMBER() OVER(PARTITION BY SUBSTR(取引コード, 1, 5) ORDER BY 取引コード) AS 優先度, 12 決済手段 13 FROM 取引手法 14) AS 優先度付き取引手法 ON 優先度付き取引手法.優先度 = 1 AND 優先度付き取引手法.取引コード5= SUBSTR(企業名.取引コード, 1, 5)

なおSQLの稼働確認にはMySQL8.0を利用しています。また、稼働確認に利用してテーブル定義やデータは以下の通りです。

SQL

1CREATE TABLE 企業名 ( 2 取引コード VARCHAR(10) PRIMARY KEY, 3 企業名 VARCHAR(255) NOT NULL 4); 5CREATE TABLE 指定取引手法 ( 6 取引コード VARCHAR(10) PRIMARY KEY, 7 決済手段 VARCHAR(50) NOT NULL 8); 9CREATE TABLE 取引手法 ( 10 取引コード VARCHAR(10) PRIMARY KEY, 11 決済手段 VARCHAR(50) NOT NULL 12); 13INSERT INTO 企業名 (取引コード, 企業名) VALUES 14('123451', '株式会社A'), 15('123452', '株式会社B'), 16('123453', '株式会社C'); 17INSERT INTO 指定取引手法 (取引コード, 決済手段) VALUES 18('123451', '現金決済'), 19('123452', 'カード決済'), 20('102321', 'Edy決済'); 21INSERT INTO 取引手法 (取引コード, 決済手段) VALUES 22('123451', '現金決済'), 23('123452', 'カード決済'), 24('123453', 'PayPay決済'), 25('102321', 'Edy決済');

投稿2025/06/26 02:56

neko_the_shadow

総合スコア2395

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

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

TakefumiSAITOH

2025/06/26 05:39

解決しました。ありがとうございます。
guest

0

普通にやるなら

sql

1select t1.取引コード, t1.企業名, t2.決済手段,t3.決済手段 2from1テーブル as t1 3left join2テーブル as t2 on t1.取引コード = t2.取引コード 4left join3テーブル as t3 on t1.取引コード = t3.取引コード

「最小のものを抽出」については具体的なサンプルを提示いただければ条件を追加することは可能です

投稿2025/06/26 00:19

yambejp

総合スコア117906

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

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

TakefumiSAITOH

2025/06/26 02:53

ありがとうございます。 「最小のものを抽出」とは、第3テーブルから、 ・「第1テーブルの取引コード上5桁」=「第3テーブルの取引コード上5桁」 で一覧を抽出し(3つ抜けると思います)、その上で昇順に抽出したレコードを並べ替えて、一番小さいものを「t3.決済手段」として、全レコードに抽出表示したい、という意味です。
yambejp

2025/06/26 03:01

すみません 具体的なサンプルデータを提示してどういう結果がほしいか例示もらえますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問