###前提・実現したいこと
以下、NAMEごとに、X13とY13の組み合わせを表現したSW_ONOFFテーブルが存在します。
組み合わせにはそれぞれ真偽を示すUSE_FLAGフィールドが存在します。
SW_ONOFF
NAME | X | Y | USE_FLAG |
---|---|---|---|
HOGE | 1 | 1 | false |
HOGE | 1 | 2 | true |
HOGE | 1 | 3 | false |
HOGE | 2 | 1 | false |
HOGE | 2 | 2 | true |
HOGE | 2 | 3 | true |
HOGE | 3 | 1 | false |
HOGE | 3 | 2 | false |
HOGE | 3 | 3 | false |
FUGA | 1 | 1 | true |
FUGA | 1 | 2 | false |
以下 | 省 | 略 | します。 |
上記テーブルより、以下の条件で抽出をしたいです。
- NAMEがHOGEのレコードを対象とする(FUGAは無視)
- 各Xごとに、USE_FLAGがTRUEのYを抽出
- Xに対して、USE_FLAGがTRUEのYが複数存在する場合、よりYが少ないものを
- USE_FLAGがTRUEのYが存在しない場合は、Yの代わりに0を設定(X=3のケース)
以下、テーブルデータになります。
SQL
1create table SW_ONOFF (NAME NVARCHAR(20) NOT NULL, 2X smallint, 3Y smallint, 4USE_FLAG bit); 5insert into SW_ONOFF values 6('HOGE',1,1,1), 7('HOGE',1,2,1), 8('HOGE',1,3,0), 9('HOGE',2,1,0), 10('HOGE',2,2,1), 11('HOGE',2,3,1), 12('HOGE',3,1,0), 13('HOGE',3,2,0), 14('HOGE',3,3,0), 15('FUGA',1,1,1), 16('FUGA',1,2,0);
###期待する結果
X | 結果 |
---|---|
1 | 1 |
2 | 2 |
3 | 0 |
###発生している問題・エラーメッセージ
下記SQLで一見抽出できているように見えるのですが、自信がありません。
正しく抽出できているのか、どこか改善点がないかご指摘いただけると幸いです。
※インデックス等の設定はしておりません。
SQL
1select 2 M.X, ISNULL(MIN(S.Y),0) 3 from 4 SW_ONOFF M 5 left outer join ( 6 select 7 NAME, X, Y 8 from 9 SW_ONOFF U 10 where 11 USE_FLAG = 1 12 ) S 13 on M.NAME = S.NAME 14 and M.X = S.X 15 where 16 M.NAME = 'HOGE' 17 group by 18 M.X
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/31 01:49