前提・実現したいこと
SQL Server 2014 についての質問です。
実データの入ったテーブル(以下コードでいうDataTable)と、それらに関わる設定値的な内容が入ったテーブル(以下コードで言うSettings)の2つを用意し、
・それぞれのcode1とcode2とcode3が合致する行を
・上記で合致するものがなければ、code1とcode2が合致する行を
・上記で合致するものがなければ、code1が合致する行を
取得(結合)したいと思っています。
発生している問題
以下のようなクエリなどを書いてみましたが、データ2・データ3・データ4は複数のSettings行が合致してしまい、希望通りに行きませんでした。
何かいい方法はありませんでしょうか。
該当のソースコード
SQL
1-- DataTableに対応する設定内容が定義されているテーブル 2CREATE TABLE Settings 3 ([code1] varchar(2) NOT NULL, [code2] varchar(3), [code3] varchar(4), [status1] varchar(30)) 4; 5INSERT INTO Settings 6 ([code1], [code2], [code3], [status1]) 7VALUES 8 ('01', '', '', '設定01'), -- 設定1 9 ('01', '001', '', '設定001'), -- 設定2 10 ('01', '001', '0002', '設定0002'), -- 設定3 11 ('01', '001', '0003', '設定0003') -- 設定4 12; 13 14-- 3つのキーコードを持つテーブル 15-- code1・code2は必ず値が入る想定。 16CREATE TABLE DataTable 17 ([code1] varchar(2) NOT NULL, [code2] varchar(3) NOT NULL, [code3] varchar(4)) 18; 19INSERT INTO DataTable 20 ([code1], [code2], [code3]) 21VALUES 22 ('01', '111', '1111'), -- データ1 23 ('01', '001', '2222'), -- データ2 24 ('01', '001', '3333'), -- データ3 25 ('01', '001', '0003') -- データ4 26-- : 27-- (略) 28-- : 29; 30
期待する結果は以下です。
・データ1 → 設定1が紐付く
・データ2 → 設定2が紐付く
・データ3 → 設定2が紐付く
・データ4 → 設定4が紐付く
試してみたクエリ1
SQL
1SELECT dt.code1,dt.code2,dt.code3,st.status1 FROM DataTable AS dt 2LEFT JOIN Settings AS st 3ON 4 dt.code1=st.code1 5 and (dt.code2=st.code2 OR st.code2='') 6 and (dt.code3=st.code3 OR st.code3='') 7;
試してみたクエリ2
SQL
1SELECT dt.code1,dt.code2,dt.code3,st.status1 FROM DataTable AS dt 2LEFT JOIN Settings AS st 3ON 4 dt.code1=st.code1 5 and st.code2 = case when dt.code2=st.code2 then dt.code2 else '' end 6 and st.code3 = case when dt.code3=st.code3 then dt.code3 else '' end 7; 8
実際は件数の多いデータになりますので、できるだけ軽く処理できればと思っているのですが…
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/10/26 09:47
2019/10/26 10:01
退会済みユーザー
2019/10/26 10:22 編集