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

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

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

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

Q&A

解決済

2回答

301閲覧

INNER JOIN に変更すると結果が0件になる

k.fujisawa

総合スコア42

MySQL

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

0グッド

0クリップ

投稿2025/04/20 06:08

結合条件は満たしているにもかかわらず、LEFT JOIN を INNER JOIN に変更すると結果が0件になります。

原因に詳しい方がいましたら、ぜひご意見をいただけないでしょうか。

該当のMySQLクエリ

select table_name, column_name, column_default, enum_values from information_schema.columns join lateral ( select concat('[', replace(regexp_substr(column_type, "'.*'"), "'", '"'), ']') ) a(a) on true left join lateral ( select a from json_table( a.a, '$[*]' columns (a text path '$') ) a ) b(enum_values) on true where table_schema = database() and data_type = 'enum';

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

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

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

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

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

guest

回答2

0

自己解決

straight_joinでも結果を取得できたので、
結合順序の問題だと分かりました。

MySQLクエリ

1select 2 table_name, 3 column_name, 4 column_default, 5 enum_value 6from 7 information_schema.columns 8 join lateral ( 9 select concat('[', replace(regexp_substr(column_type, "'.*'"), "'", '"'), ']') 10 ) a(a) on true 11 straight_join lateral ( 12 select a 13 from json_table( 14 a.a, 15 '$[*]' columns (a text path '$') 16 ) a 17 ) b(enum_value) on true 18where 19 table_schema = database() 20 and data_type = 'enum';

投稿2025/04/20 13:01

k.fujisawa

総合スコア42

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

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

0

lateralキーワード自体が、相関問合せを宣言するようなものなので、使用する際は、joinは使用しません。
13.2.11.9 ラテラル導出テーブル
記述したjoinがどう作用しているかに興味があるなら実行計画で確認されると良いと思います。

質問にあるleft joinをinner join に変更する目的が、抽出件数を変えたいというという事であれば、現状のwhere句に追加するのが良いと思います。
判断が必要な情報がlateral導出されるのであれば、そのselect項目に追加すれば参照できますし。

投稿2025/04/20 08:34

sazi

総合スコア25426

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

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

k.fujisawa

2025/04/20 09:45

添付いただいたサイトには、 以下の記述があります。 ``` ラテラル導出テーブルは、カンマで区切られたテーブルのリストまたは結合指定 (JOIN, INNER JOIN, CROSS JOIN, LEFT [OUTER] JOIN または RIGHT [OUTER] JOIN) のいずれかで、FROM 句でのみ使用できます。 ``` >joinは使用しません。 このような記述はなさそうです。
sazi

2025/04/21 00:27

>>joinは使用しません。 >このような記述はなさそうです。 失礼しました。サンプルを見た時Cross joinの記述しか無かった為、そのように思い込んでいました。
sazi

2025/04/21 00:34

自己解決された内容を見ました。 LATERALなのに先に参照されるというのは解せないし、そうならない為にはstraight_join を使用するという事なら、せめてリファレンスに記述されるべきではないかと思いました。 MySQLでは実行計画での確認が重要ですね。
k.fujisawa

2025/04/21 03:16

バグのようにも見えますね…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問