質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%

Q&A

解決済

3回答

1182閲覧

内部結合の条件部分で、データを取得できた条件を使用し、結合させたいです。

wawawa3120

総合スコア5

0グッド

0クリップ

投稿2021/06/10 13:29

編集2021/06/10 23:33

前提・実現したいこと

複数のテーブルを内部結合する際に、結合条件を、条件によって使用するか判定したいです。
inner joinのonの中で、case文を使用し、結合条件を使用する条件を分けることは可能でしょうか。
また、case文でexitsを使うときのselect文の条件につきまして、発生している問題に記載しました。

現在明細マスタ(meisai_mst)と組織マスタ(soshiki_mst)を結合します。
結合の条件は、
(1)[地域][組織]の順で、値を取得できた条件を使用します。
(2)代表者で結合します。

明細マスタ(meisai_mst)

明細No(meisaino)入金日(nyukinbi)組織(soshiki)地域(tiiki)代表者(daihyo)
12020/12/3010null山田花子
22020/12/30101山田花子

組織マスタ(soshiki_mst)

法人No(hojinno)組織(soshiki)地域(tiiki)代表者(daihyo)代理店(dairiten)
1101山田花子AAA
2101山田花子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)
110null山田花子AAA
110null山田花子BBB
2101山田花子AAA
2101山田花子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;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2021/06/10 14:52

SQLで動作確認が必要な質問は、テーブル定義やデータをCREATE TABLEとINSERTに修正できた方がコメントしてくれる人が多いかと。
wawawa3120

2021/06/10 15:10

ありがとうございます。CREATE文、INSERT文を記載しました。
sazi

2021/06/10 17:27 編集

SQLを実行してもエラーになるし、何がどうできていないのか明確になっていませんので、どのような結果を得たいのかを例示して下さい。
wawawa3120

2021/06/13 09:50

エラーになることを確認でき、お手数おかけします。コードを修正しました。得たい結果は「取得結果」にあるレコードです。
guest

回答3

0

自己解決

INNER JOINで取得せず、テーブル(soshiki_mst)に対して各SQLを発行し、その結果を元に実現するよう仕様変更となりました。

投稿2023/03/13 12:04

wawawa3120

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「--必要?」の箇所を>記載してもしなくても、結果が変わりませんでした。

質問のデータは結果の変わらないものしかありませんから、結果が変わらないのは当然ですよね。

テーブル定義には制約など一切ありませんから、それ以外のデータがあるのかどうかはこちらでは判断できませんよ?

そもそも、非効率なSQLにしか見えませんが、条件が良く分かりませんので、SQL文に関するアドバイスは控えておきます。

投稿2021/06/11 00:27

編集2021/06/11 00:31
sazi

総合スコア25188

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wawawa3120

2021/06/13 09:53

おっしゃる通り、「--必要?」のデータを変えてみて試してみますと、結果が変わることを確認しました。 「meisai_m.tiiki」→「meisai_m.soshiki」の順で、結果が取得できた方の条件を取得する、ということを実現したかったです。
guest

0

やりたいことは以下の通りでしょうか?

  1. 地域と組織をもとに結合相手を探す
  2. 代表者をもとに結合相手を探す。ただし1で結合相手が決まっている明細については除く
  3. 1で得られた結果と2で得られた結果を合わせて出力する

であれば、これをSQLにそのまま落とし込めばよいかと思います。

SQL

1WITH A AS ( 2 SELECT M.meisaino, M.soshiki, M.tiiki, M.daihyo, S.dairiten 3 FROM meisai_mst AS M 4 JOIN soshiki_mst AS S ON M.tiiki = S.tiiki AND M.soshiki = S.soshiki 5) 6 SELECT * FROM A 7UNION ALL 8 SELECT M.meisaino, M.soshiki, M.tiiki, M.daihyo, S.dairiten 9 FROM meisai_mst AS M 10 JOIN soshiki_mst AS S ON M.daihyo = S.daihyo 11 WHERE NOT M.meisaino IN (SELECT meisaino FROM A)

投稿2021/06/10 16:55

neko_the_shadow

総合スコア2230

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wawawa3120

2021/06/13 09:57

1.の「地域と組織をもとに結合相手を探す」が「地域または組織をもとに結合相手を探す」かつ「地域でレコードが取得」できれば、「組織で取得しない」 2.の「代表者」は、1の条件とandで必ずきく ことを実現したかったです。
neko_the_shadow

2021/06/13 11:08

やりたいことをもう一度整理すると以下のようになる認識ですが、正しいでしょうか? ① 地域と代表者をもとに結合相手を探す。 ② 組織と代表者をもとに結合相手を探す。ただし①で結合相手が見つかっている場合は除く。 ③ ①の結果と②の結果を合わせて出力する。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問