さわらブログ

さわら(@xhiroga)の技術ブログ

【備忘録】結合条件なしのJOIN

職場で困ったので、調べたことの棚卸し。

やりたかったこと

売り上げテーブルAの全てのレコードと会計年月テーブルBの最新のレコード1件を結合したかった。

会計年月テーブルA
商品 売り上げ金額
冷蔵庫 50000円
電気ケトル 10000円
掃除機 30000円

 

会計年月テーブルB
会計年月
201707
201708
201709

 

結果
会計年月 商品 売り上げ金額
201707 冷蔵庫 50000円
201707 電気ケトル 10000円
201707 掃除機 30000円

 

そのための方法

調べた感じ、Bから副表を作った後でAと結合すれば良いみたい。結合方法は...

  1. CROSS JOINする
  2. FROM句の後にテーブルを並列に書く(CROSS JOINになる)
  3. ON句なしでINNER JOINする
  4. SELECT句中でサブクエリを使う

他にもあったら教えて下さい...!

1. CROSS JOINする

SELECT A.商品, A.売り上げ金額, B_TMP.会計年月 FROM A CROSS JOIN (SELECT 会計年月 FROM B ORDER BY 会計年月 ASC FETCH FIRST 1 ROWS ONLY) AS B_TMP

2.  FROM句の後にテーブルを並列に書く(CROSS JOINになる)

SELECT A.商品, A.売り上げ金額, B_TMP.会計年月 FROM A, (SELECT 会計年月 FROM B ORDER BY 会計年月 ASC FETCH FIRST 1 ROWS ONLY) AS B_TMP

これが調べた中で一番驚きました。

 3. ON句なしでINNER JOINする

SELECT A.商品, A.売り上げ金額, B_TMP.会計年月 FROM A INNER JOIN (SELECT 会計年月 FROM B  ORDER BY 会計年月 ASC FETCH FIRST 1 ROWS ONLY) AS B_TMP ON 1 = 1

4. SELECT句中でサブクエリを使う

SELECT A.商品, A.売り上げ金額, (SELECT 会計年月 FROM B ORDER BY 会計年月 ASC FETCH FIRST 1 ROWS ONLY) AS 会計年月 FROM A

 

* 細かい書き方はDBMSによって違うと思います(FETCHとか)。さわらはDB2っぽく書いてます。