なんとなく背景
始めまして、株式会社ジールのSOです。
SQLに触れ始めてから7年目になりましたが、
実務中の経験を踏まえ、改めていろんな構文を考え直したいと思います。
初心者のみならず、少しご参考になることがあれば大変嬉しいです!
※今回はSnowflake環境を利用しますが、結果は変わらないと思います。
まずは、~INNER JOIN編~
INNER JOINとは
INNER JOINは2つ以上のテーブルからデータを結合するSQL構文の一つです。 この結合方法は共通のキーを持つ行のみを抽出し、それらを結合して新しい結果セットを作成します。 結果として得られるテーブルには結合条件を満たす行だけが含まれるため、データが一致しない行は除外されます。
だそうです。
(・・?
共通のキーを持つ行のみを抽出と言ってますが、
片方にキーが重複する場合結果セットはどなるの?
両方にキーが重複する場合結果セットはどうなるの?
イメージ全然ないので、「TEST_NAME」と「TEST_ADDRESS」2つのテストデータを利用し見ていきます。
①結合キーに重複がない
👇TEST_NAME 結合キーに重複ない
👇TEST_ADDRESS 結合キーに重複ない
👇結果セット
無難に普通の3行の結果セットが作成されましたね
②片方テーブルの結合キーに重複あり
👇TEST_NAME 結合キーに重複ない
👇TEST_ADDRESS 結合キーに重複あり
「ID=1」レコートが2行存在する
👇結果セット
花子さんのレコートが2行になり、4行の結果セットが作成ましたね
➂両方テーブルの結合キーが重複あり
👇TEST_NAME 結合キーに重複あり
「ID=1」レコートが2行存在する
👇TEST_ADDRESS 結合キーに重複あり
「ID=1」レコートが2行存在する
👇結果セット
「ID=1」のすべての組み合わせパターンで結果セットが作成されて、なんかわけわからないですね
結論
レコードを一意に識別できるようなカラムを利用して結合を行えば問題ないかと思いますが、
データ要件や実務中で忘れがちなので、上記のような事象が起こりうるのではないかと思いますね。
いかがでしょうか。~
「なるほど!」と「それはそうでしょう」と思う方それぞれいらっしゃると思いますが、
今回の検証みたいな少し変わったSQLで改めて理解を深めることができたら嬉しいです!
ご案内
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください:
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area