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

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

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

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

Q&A

解決済

1回答

1680閲覧

SQL with句を利用して複数のテーブルのデータを表示させる方法

sabasoba

総合スコア5

SQL

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

0グッド

0クリップ

投稿2020/09/27 06:39

編集2020/09/27 06:51

前提・実現したいこと

複数のテーブルをサブクエリで結合し、且つWith句を利用してデータを取得しようとしたところ、
データがnullになってしまう現象が発生します。どのようにSQLを記載すれば問題が解決できますでしょうか。
お知恵をおかしください。

メインテーブル as メイン 商品ID, 仕入れ日 配送テーブル as 配送 商品ID, 配送ID 配送詳細テーブル as 配送詳細 配送ID, 配送サービス名, 更新日

このようなテーブルがあり、各商品ID毎の配送サービス名を表示したいです。
配送詳細テーブルは、配送サービスを変更するごとにその時の更新日とともに行数が増えてしまうので、
1商品IDに対して一つの配送サービス名が表示されるようなSQLを書きたいです。
※配送サービスを更新する毎に下記のようになってしまうので、
「補足」配送サービス毎に配送IDが異なります。
配送ID, 配送サービス名, 更新日
12345,ヤマト, 2020-01-01
32145, 佐川, 2019-12-01

可能な限り下記のベースとなるWith句を用いて記載したいです。

該当のソースコード

SQL

1 2with 配送情報 as 3( 4Select 配送.商品ID, 配送詳細.配送サービス名, 配送詳細.更新日 5from 配送テーブル as 配送 6 7left join 配送詳細テーブル as 配送詳細 8on 配送.配送ID = 配送詳細.配送ID 9order by 配送詳細.更新日 DESC limit 1 10) 11 12SELECT メイン.商品ID, 配送情報.配送サービス名 13from メインテーブル as メイン 14LEFT JOIN 配送情報 on 15配送情報.商品ID = メイン.商品ID 16

上記コードの結果

上記コードを走らせると、
なぜか

メイン.商品ID, 配送情報.配送サービス名 xxxxxx123, null

というデータがかえってきます。

with句のなかに下記のように商品IDを特定すると結果はしっかり帰ってきます。

with 配送情報 as ( Select 配送.商品ID, 配送詳細.配送サービス名, 配送詳細.更新日 from 配送テーブル as 配送 left join 配送詳細テーブル as 配送詳細 on 配送.配送ID = 配送詳細.配送ID where 配送.商品ID = xxxxxx123 order by 配送詳細.更新日 DESC limit 1 )

ただデータを取得する際には大量な商品IDのデータを取得するので、
With句内のwhereで商品IDを指定することはできない状況です。

この問題を解決するにはどのようなSQLを記載すべきでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

limit 1を指定しているので、商品IDに関わらず、1件しか取得できていません。
商品ID毎に1件になるようにする必要があります。

以下は相関副問合せによるnot exists判定で、商品ID毎に配送詳細テーブルの更新日が最大のものに限定しています。

SQL

1with 配送情報 as ( 2 Select 配送.商品ID, 配送詳細.配送サービス名, 配送詳細.更新日 3 from 配送テーブル as 配送 4 left join 配送詳細テーブル as 配送詳細 5 on 配送.配送ID = 配送詳細.配送ID 6 where not exists( 7 select 1 8 from 配送テーブル 9 left join 配送詳細テーブル 10 on 配送テーブル.配送ID = 配送詳細テーブル.配送ID 11 where 配送テーブル.商品ID = 配送.商品ID 12 and 配送詳細テーブル.更新日 > 配送詳細.更新日 13 ) 14) 15SELECT メイン.商品ID, 配送情報.配送サービス名 16from メインテーブル as メイン 17 LEFT JOIN 配送情報 18 on 配送情報.商品ID = メイン.商品ID

投稿2020/09/27 06:51

編集2020/09/27 08:11
sazi

総合スコア25206

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

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

sabasoba

2020/09/27 07:53

ありがとうございます。 頂いたコード内に、配送詳細.商品IDとありますが、 where 配送テーブル.商品ID = 配送詳細.商品ID 配送詳細テーブルには商品IDの情報がございませんので、エラーとなってしまいました。 この部分考慮した場合、どのように記載することがよろしいでしょうか。。。
sazi

2020/09/27 08:14 編集

訂正しました。 因みに、更新日は商品ID毎にユニークであることが前提です。
sabasoba

2020/09/27 09:08

ありがとうございます。完璧に実現できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問