~/blog/problem-of-reduced-row-count-in-join-sql
Published on

SQLのJOINでrows(レコード)のカウントが減ってしまう問題

2917文字5分で読めます–––
閲覧数
Authors
  • avatar
    Name
    Shou Arisaka nyapp.buzz/shou
    short bio
    Z世代の情報技術者。Next.jsで自作SNSを個人開発中。

SQLのJOINでrows(レコード)のカウントが減ってしまう問題について考えてみました。

SQLはあまり詳しくないのでなんて説明すればいいのかわからないのですけど、joinするとjoinしたテーブルと同じカラムを元のテーブル上にも持っていないと、持っていない列は削除された状態で出力されてしまう。よって、出力されるrowsの数が減ってしまうので、例えばselect元のテーブル全ての情報に加えてjoinしたテーブルのxxカラムを含めてwhereでregex検索したいよーなんて場合に不便があります。

…まじで説明できない。

そういうときは、leftを使うと解決できますよという話。

SELECT u.id, u.url, u.visit_count, u.title FROM urls AS u

36254 rows returned

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_de652660-c4ec-42d2-abd3-b0996b722fb8.png
SELECT u.id, u.url, u.visit_count, u.title, kw.term FROM urls AS u
JOIN keyword_search_terms AS kw ON kw.url_id = u.id
JOIN visits AS v ON v.url = u.id

18520 rows returned

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_cbbe3df2-7a4a-4eab-8db7-310fa7adcd12.png
SELECT u.id, u.url, u.visit_count, u.title, kw.term FROM urls AS u
left JOIN keyword_search_terms AS kw ON kw.url_id = u.id
left JOIN visits AS v ON v.url = u.id

74926 rows returned

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_7f7ee7e6-6097-4933-bbd8-018f46129c77.png

joinの前にleftを宣言するだけです。

sql join keep all records - Google Search sql join decreased rows - Google Search SQL Server : left join results in fewer rows than in left table - Stack Overflow

せっかくなのでもう少し深掘り。

joinには4種類あるようです。

(INNER) JOIN: Returns records that have matching values in both tables LEFT (OUTER) JOIN: Return all records from the left table, and the matched records from the right table RIGHT (OUTER) JOIN: Return all records from the right table, and the matched records from the left table FULL (OUTER) JOIN: Return all records when there is a match in either left or right table

以下グラフがわかりやすい。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_8bbc03a3-401c-4f28-b564-7afe30f7cc6c.pngSQL Joins mysql - Selecting all items in one table and join with another table, allowing nulls - Stack Overflow

一番使い勝手が良さそうなのはやはりLEFTですかね。

rightをsqliteで実行してみたら対応していないと言われてしまった。

RIGHT and FULL OUTER JOINs are not currently supported

avatar

Shou Arisaka

情報技術者 / Z世代プログラマー / SaaSアプリやSNSを開発
今すぐ話そう!

15歳でWordPressサイトを立ち上げ、ウェブ領域に足を踏み入れる。翌年にはRuby on Railsを用いたマイクロサービス開発に着手し、現在はデジタル庁を支えたNext.jsによるHP作成やSaaS開発のプロジェクトに携わりながら、React.js・Node.js・TypeScriptによるモダンなウェブアプリの個人開発を趣味でも行う。
フロントエンドからバックエンドまで一貫したアジャイルなフルスタック開発を得意とし、ウェブマーケティングや広告デザインも必要に応じて担当、広告運用・SEO対策・データ分析まで行う低コストかつ高品質な顧客体験の提供が好評。
国内外から200万人を超える人々に支えられ、9周年を迎えるITブログ「yuipro」の開発者、デザイナーでありライター。現在ベータ段階の自作SNS「nyapp.buzz」を日本一の国産SNSとするべく奮闘中。

Created with Fabric.js 5.2.4 何かご質問がありますか?