質問: BB.担当者コード ) ``` ■結果 | 地域コード | 会社コード | 部署コード | 担当者コード | 削除フラグ | | --- | --- | --- | --- | --- | | 1000 | 200 | 10 | 01 | 0 | | 1000 | 200 | 10 | 02 | 0 | | 1000 | 200 | 10 | 03 | 0 | ・削除フラグが「1」のAPPLI_TRANS_TBLは除外される ・論理削除されるTRANS_TBLが除外されない ### 背景 変更内容のファイル出力の条件分岐に必要となるSQLになります。 部署単位で見た際、削除フラグが0(有効)のものが存在しない場合にファイル出力をします。 ファイル出力→マスタ変更処理の順で行われるため、 一度マスタと申込内容を結合し、その後、削除申込と削除されるマスタを除外して、 レコード存在チェックをしています。 ### 補足情報(FW/ツールのバージョンなど) 企業向けの一般的でないSQLを使用していますが、 記載方法に関してはほぼMySQLなどのメジャーなものと変わらない認識です。 初心者ゆえ分かりづらい表現が多いかもしれません、申し訳ございません。 お手数ですが、何卒よろしくお願い致します。 (追記) 説明不足ですみません。 存在チェック自体は部署コード単位なのですが、 除外する、しないは担当者コード単位で行いたいのです。 また、同じ申込番号で、 レコードは分かれますが、追加と削除どちらも行うことが出来るため (この場合、 担当者コード01が削除、03が追加) 一度担当者コード含めた主キーを取得して、 削除されるマスタ・削除申込を除外し 削除されないマスタ、追加される申込を残したい所存です。 何卒よろしくお願い致します。
回答: **UNION** する前に **Not Exists**する方が効率的です。 ``` SELECT 地域コード, 会社コード, 部署コード, 担当者コード, 削除フラグ FROM TRANS_TBL WHERE 地域コード='1000' and 会社コード='200' and 部署コード='10' and 削除フラグ='0' and not exists( select 1 from APPLI_TRANS_TBL where 地域コード='1000' and 会社コード='200' and 部署コード='10' and 削除フラグ='1' ) UNON ALL SELECT 地域コード, 会社コード, 部署コード, 担当者コード, 削除フラグ FROM APPLI_TRANS_TBL WHERE 申込番号='2018102101' and 地域コード='1000' and 会社コード='200' and 部署コード='10' and 削除フラグ='0' and not exists( select 1 from TRANS_TBL where 地域コード='1000' and 会社コード='200' and 部署コード='10' ) ``` 追記 > > 変更内容のファイル出力の条件分岐に必要となるSQLになります。 > > 部署単位で見た際、削除フラグが0(有効)のものが存在しない場合にファイル出力をします。 > > > `TRANS_TBL`に存在しない`APPLI_TRANS_TBL`の抽出という事なら以下で良いかと思います。 ※`TRANS_TBL`のキーは地域コード、会社コード、部署コード、担当者コードだとして ``` SELECT distinct 地域コード, 会社コード, 部署コード, 担当者コード FROM APPLI_TRANS_TBL as t1 WHERE 削除フラグ='0' and not exists( select 1 from TRANS_TBL where 地域コード=t1.地域コード and 会社コード=t1.会社コード and 部署コード=t1.部署コード and 担当者コード=t1.担当者コード ) ```