SQLについて
以下、SQL作成に困っております。
お助けください。
環境
sqlserver2008 t-sql
※番号はSQLの文中と関連付けしております。
1には顧客の情報を保持
2には顧客と店舗を結び付け資料送付対象の情報を保持
3には2の送付済み情報を履歴として保持しています。
実施したい事は
1と2を関連付けして、資料の送付対象の店舗を一覧表示したい
1と3を関連付けして、2に無いのに送付してしまった。
送付間違いを一緒に表示したいのです。
以下の、SQLの前に
1、2の情報にUNIONして
3だけの情報から2をNot Existsを使用して
抽出しておりましたが、保守性が悪いのでUNIONを使用しないで
との話があり以下を作成しました。
困っていることですが
3のon句の記述に困っています。
以下のSQLでは資料送付済みの情報が表示されません。
3のon句を
on 資料送付済み.顧客CD = お客さん情報.顧客CD and
資料送付済み.年度 = お客さん情報.年度
に置き換えると、お客さん情報に店舗CDが存在しない為、
全組合せ?になってしまい、実データより膨大な出力結果になってしまいます。
UNIONをしないで正しい結果を出力したいです。
お助けください。
declare
@年度 varchar(4) = '2011',
@店舗CD varchar(6) = ''
SELECT
, お客さん情報.年度
, お客さん情報.顧客CD
, お客さん情報.顧客名
, 店舗への送付情報.店舗CD
, 資料送付済み.店舗CD AS 店舗CD2
, 店舗マスタ.店舗名
, 送付ステータス = case when 店舗への送付情報.店舗CD = NULL and 資料送付済み.店舗CD != NULL then '送付間違い' else '' end
FROM
(select * from お客さん情報
where 年度 = @年度 ) お客さん情報 --1 メインテーブル
left join
(select * from 店舗への送付情報
where 年度 = @年度 ) 店舗への送付情報 --2 資料の送付対象店舗情報を保持
on 店舗への送付情報.顧客CD = お客さん情報.顧客CD and 店舗への送付情報.年度 = お客さん情報.年度
left join
(select * from 資料送付済み
where
年度 = @年度
) 資料送付済み --3 資料の送付済み情報を保持
on 資料送付済み.顧客CD = 店舗への送付情報.顧客CD and
資料送付済み.年度 = 店舗への送付情報.年度 and
資料送付済み.店舗CD != 店舗への送付情報.店舗CD
left join 店舗マスタ on 店舗への送付情報.店舗CD = 店舗マスタ.店舗CD
order by 店舗CD desc
お礼
ありがとうございます! なるほどです。併記します。