前提・実現したいこと
複数のテーブルを内部結合する際に、結合条件を、条件によって使用するか判定したいです。
inner joinのonの中で、case文を使用し、結合条件を使用する条件を分けることは可能でしょうか。
また、case文でexitsを使うときのselect文の条件につきまして、発生している問題に記載しました。
現在明細マスタ(meisai_mst)と組織マスタ(soshiki_mst)を結合します。
結合の条件は、
(1)[地域][組織]の順で、値を取得できた条件を使用します。
(2)代表者で結合します。
明細マスタ(meisai_mst)
明細No(meisaino) | 入金日(nyukinbi) | 組織(soshiki) | 地域(tiiki) | 代表者(daihyo) |
---|---|---|---|---|
1 | 2020/12/30 | 10 | null | 山田花子 |
2 | 2020/12/30 | 10 | 1 | 山田花子 |
組織マスタ(soshiki_mst)
法人No(hojinno) | 組織(soshiki) | 地域(tiiki) | 代表者(daihyo) | 代理店(dairiten) |
---|---|---|---|---|
1 | 10 | 1 | 山田花子 | AAA |
2 | 10 | 1 | 山田花子 | BBB |
create table meisai_mst
(
meisaino CHARACTER(255),
nyukinbi date,
soshiki CHARACTER(255),
tiiki CHARACTER(255),
daihyo CHARACTER(255)
);
create table soshiki_mst
(
hojinno CHARACTER(255),
soshiki CHARACTER(255),
tiiki CHARACTER(255),
daihyo CHARACTER(255),
dairiten CHARACTER(255)
)
INSERT INTO meisai_mst values('1',cast('2020/12/30'as date),'10',null,'山田花子');
INSERT INTO meisai_mst values('2',cast('2020/12/30'as date),'10','1','山田花子');
INSERT INTO soshiki_mst values('1','10','1','山田花子','AA');
INSERT INTO soshiki_mst values('2','10','1','山田花子','BB');
上記のデータでは、明細No(pk)1は[組織]で結合し、明細No(pk)2は[地域]で結合します。
どちらも明細マスタ1件に対し、組織マスタのデータが2件取得できます。
取得結果
meisai_mst.明細No(pk) | meisai_mst.組織(soshiki) | meisai_mst.地域(tiiki) | meisai_mst.代表者(daihyo) | soshiki_mst.代理店(dairiten) |
---|---|---|---|---|
1 | 10 | null | 山田花子 | AAA |
1 | 10 | null | 山田花子 | BBB |
2 | 10 | 1 | 山田花子 | AAA |
2 | 10 | 1 | 山田花子 | BBB |
発生している問題・エラーメッセージ
on以下を下記に変更することで取得できました。
しかし「--必要?」の箇所を>記載してもしなくても、結果が変わりませんでした。
代表者名(daihyo)も結合条件に入れたい場合、「case when exists」内に記載が必要かご教示ください。**
該当のソースコード
Postgres
1 select meisai_m.meisaino, --明細No 2 meisai_m.soshiki, --組織 3 meisai_m.tiiki, --地域 4 meisai_m.daihyo, --代表者 5 soshiki_m.dairiten --代理店 6 from meisai_mst meisai_m 7 inner join soshiki_mst soshiki_m 8 on 9 ( 10 meisai_m.tiiki = 11 (case when exists (select 1 from soshiki_mst soshiki_m 12 where soshiki_m.tiiki = meisai_m.tiiki 13 and meisai_m.daihyo = soshiki_m.daihyo --必要? 14 ) 15 then soshiki_m.tiiki 16 end) --地域 17 or meisai_m.soshiki = 18 (case when exists ( select 1 from soshiki_mst soshiki_m 19 where soshiki_m.soshiki = meisai_m.soshiki 20 and meisai_m.daihyo = soshiki_m.daihyo --必要? 21 ) 22 then soshiki_m.soshiki 23 end) --組織 24 ) 25 and meisai_m.daihyo = soshiki_m.daihyo;
回答3件
あなたの回答
tips
プレビュー