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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

4回答

1951閲覧

テーブルA,BをUNION ALLして結合したテーブルに対して、取得したAを条件にしてNOT EXISTSしたい

machiyoi

総合スコア7

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/10/21 05:10

編集2018/10/22 00:07

前提・実現したいこと

マスタとなる取引担当テーブル(TRANS_TBL)と
それに変更を加える際に必要な情報が入った申込取引担当テーブル(APPLI_TRANS_TBL)があります。

APPLI_TRANS_TBLの部署コードまでと一致する、かつ削除フラグが0(有効)なTRANS_TBLを取得し、
APPLI_TRANS_TBLと結合します。

 
■TRANS_TBL(マスタ)

地域コード会社コード部署コード担当者コード削除フラグ
100020010010
100020010020
100020020030

 
■APPLI_TRANS_TBL(申込内容)

申込番号地域コード会社コード部署コード担当者コード削除フラグ
2018102101100020010011
2018102101100020010030

 
■結合後

地域コード会社コード部署コード担当者コード削除フラグ
100020010010
100020010020
100020010011
100020010030

この結合したものから、
・削除フラグが「1」のもの
・↑と担当者コードまで一致するTRANS_TBL(論理削除されるマスタ)
を除外したいです。

 
■期待結果

地域コード会社コード部署コード担当者コード削除フラグ
100020010020
100020010030

試したこと

SQL

1SELECT 2B.地域コード 3B.会社コード 4B.部署コード 5B.担当者コード 6B.削除フラグ 7FROM 8TRANS_TBL AS B 9WHERE 10B.地域コード = '1000' 11B.会社コード = '200 12B.部署コード = '10' 13B.削除フラグ = '0' 14 15UNON ALL 16 17SELECT 18A.地域コード 19A.会社コード 20A.部署コード 21A.担当者コード 22A.削除フラグ 23FROM 24APPLI_TRANS_TBL AS A 25WHERE 26A.申込番号 '2018102101' 27A.地域コード = '1000' 28A.会社コード = '200 29A.部署コード = '10' 30AND NOT EXISTS( 31SELECT * 32FROM TRANS_TBL AS BB 33A.地域コード = BB.地域コード 34A.会社コード = BB.会社コード 35A.部署コード = BB.部署コード 36A.担当者コード = BB.担当者コード 37)

 
■結果

地域コード会社コード部署コード担当者コード削除フラグ
100020010010
100020010020
100020010030

・削除フラグが「1」のAPPLI_TRANS_TBLは除外される
・論理削除されるTRANS_TBLが除外されない

背景

変更内容のファイル出力の条件分岐に必要となるSQLになります。
部署単位で見た際、削除フラグが0(有効)のものが存在しない場合にファイル出力をします。
ファイル出力→マスタ変更処理の順で行われるため、
一度マスタと申込内容を結合し、その後、削除申込と削除されるマスタを除外して、
レコード存在チェックをしています。

補足情報(FW/ツールのバージョンなど)

企業向けの一般的でないSQLを使用していますが、
記載方法に関してはほぼMySQLなどのメジャーなものと変わらない認識です。

 
初心者ゆえ分かりづらい表現が多いかもしれません、申し訳ございません。
お手数ですが、何卒よろしくお願い致します。

(追記)
説明不足ですみません。
存在チェック自体は部署コード単位なのですが、
除外する、しないは担当者コード単位で行いたいのです。

また、同じ申込番号で、
レコードは分かれますが、追加と削除どちらも行うことが出来るため
(この場合、
担当者コード01が削除、03が追加)
一度担当者コード含めた主キーを取得して、
削除されるマスタ・削除申込を除外し
削除されないマスタ、追加される申込を残したい所存です。
何卒よろしくお願い致します。

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

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

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

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

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

guest

回答4

0

UNION する前に Not Existsする方が効率的です。

SQL

1 SELECT 地域コード, 会社コード, 部署コード, 担当者コード, 削除フラグ 2 FROM TRANS_TBL 3 WHERE 地域コード='1000' and 会社コード='200' and 部署コード='10' and 削除フラグ='0' 4 and not exists( 5 select 1 from APPLI_TRANS_TBL where 地域コード='1000' and 会社コード='200' and 部署コード='10' and 削除フラグ='1' 6 ) 7UNON ALL 8 SELECT 地域コード, 会社コード, 部署コード, 担当者コード, 削除フラグ 9 FROM APPLI_TRANS_TBL 10 WHERE 申込番号='2018102101' and 地域コード='1000' and 会社コード='200' and 部署コード='10' and 削除フラグ='0' 11 and not exists( 12 select 1 from TRANS_TBL where 地域コード='1000' and 会社コード='200' and 部署コード='10' 13 )

追記

変更内容のファイル出力の条件分岐に必要となるSQLになります。
部署単位で見た際、削除フラグが0(有効)のものが存在しない場合にファイル出力をします。

TRANS_TBLに存在しないAPPLI_TRANS_TBLの抽出という事なら以下で良いかと思います。
TRANS_TBLのキーは地域コード、会社コード、部署コード、担当者コードだとして

SQL

1 SELECT distinct 地域コード, 会社コード, 部署コード, 担当者コード 2 FROM APPLI_TRANS_TBL as t1 3 WHERE 削除フラグ='0' 4 and not exists( 5 select 1 from TRANS_TBL where 地域コード=t1.地域コード and 会社コード=t1.会社コード and 部署コード=t1.部署コード and 担当者コード=t1.担当者コード 6 )

投稿2018/10/21 05:50

編集2018/10/21 09:35
sazi

総合スコア25195

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

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

0

すみません、本件自己解決致しました。
時間ができた際に方法追記できればと思います。

投稿2018/10/22 23:27

machiyoi

総合スコア7

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

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

0

背景については理解できませんでした。

期待結果についてのみの回答です。

SELECT B.地域コード, B.会社コード, B.部署コード, B.担当者コード, B.削除フラグ
FROM TRANS_TBL AS B
WHERE EXISTS (SELECT 1 FROM APPLI_TRANS_TBL AS A
WHERE B.地域コード = A.地域コード
AND B.会社コード = A.会社コード
AND B.部署コード = A.部署コード)
AND NOT EXISTS(SELECT 1 FROM APPLI_TRANS_TBL AS A
WHERE B.地域コード = A.地域コード
AND B.会社コード = A.会社コード
AND B.部署コード = A.部署コード
AND B.担当者コード = A.担当者コード
AND A.削除フラグ = '1')
AND B.削除フラグ = '0'
UNION ALL
SELECT A.地域コード, A.会社コード, A.部署コード, A.担当者コード, A.削除フラグ
FROM APPLI_TRANS_TBL AS A
WHERE A.削除フラグ = '0'

投稿2018/10/21 07:45

編集2018/10/21 07:54
iruyas

総合スコア1067

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

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

sazi

2018/10/21 09:12

SQLを```で括った方が見やすくなります。 その際、字下げなどで整形した方が良いかと。
guest

0

sql

1select * from TRANS_TBL as A 2where A.'担当者コード' not in (select B.'担当者コード' from TRANS_TBL as B where B.'削除フラグ' = 1) 3 and A.'担当者コード' not in (select C.'担当者コード' from APPLI_TRANS_TBL as C where C.'削除フラグ' = 1)

投稿2018/10/21 05:21

編集2018/10/21 05:50
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問