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