2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【SQL】テーブル結合 JOIN の条件絞り込み

Posted at

SQLのテーブル結合で考え違いをしていたことが発覚したので、記録しておきます。

前提1:下記のような2つのテーブルA、Bを結合して全ての売り上げデータを表示させたい、とします。
前提2:両テーブルの flgカラム が 0(有効)のデータだけに絞り込みたい、とします。

【テーブル名:A(売上トランザクション)】

flg date code suryo
1 2022/02/01 A001 5
0 2022/02/01 A001 6
0 2022/02/05 A003 3
0  2022/02/10 A003 4

【テーブル名:B(商品マスター)】

flg code name price
0 A001 りんご 150
0 A002  みかん 60
0 A003 ぶどう 300
1  A003 ぶどう 350

誤)
Bテーブルを flg='0'で絞った後にAテーブルと連結したい、思ってこんな記述をしていた。

test.sql
select * from A 
left join B 
on (A.code = B.code) and (B.flg = '0')
where A.flg = 0

両テーブルの主キーはcodeとflg。そこを認識していなかった。

 ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓

正)

test.sql
select * from A 
left join B 
on (A.flg = B.flg) and (A.code = B.code)
where A.flg = 0
<結果>
A.flg A.date A.code A.suryo B.flg B.code B.name B.price
0 2022/02/01 A001 6 0 A001 りんご 150
0 2022/02/05 A003 3 0 A003 ぶどう 300
0  2022/02/10 A003 4 0 A003 ぶどう 300

<ポイント>

on句には、レコードを一意に特定する主キー を設定する。

結合してから where句で A.flg = 0 とすればいい。


結合前にレコードを絞りたい場合は

Join (select* from Table where XX=AA) as TB
と言うように、Select文をもう1つ記載して結合する方がわかりやすい。

test.sql
select * from A 
left join (select * from B where price = 150) as B2 
on (A.flg = B2.flg) and (A.code = B2.code)
where A.flg = 0
2
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?