質問: 分岐sqlを一発のsqlで実現したい 【データベース:sqlserver2005】 sqlのアドバイスを頂きたいです。 【テーブル】 テーブル名:table1 フィールド名:種類、キー1、キー2 テーブル名:table2 フィールド名:種類、キー1、キー2 テーブル名:table3 フィールド名:種類、キー1、キー2 【データ】 table1 種類、キー1、キー2 001 aaa bbb 001 aaa ccc 001 aaa ddd table2 種類、キー1、キー2 002 aaa bbb 002 aaa ccc null aaa ddd table3 種類、キー1、キー2 null aaa bbb null aaa ccc null aaa ddd これをunionで取得します。 種類、キー1、キー2 001 aaa bbb 001 aaa ccc 001 aaa ddd 002 aaa bbb 002 aaa ccc null aaa ddd null aaa bbb null aaa ccc 実現したいのは、 1)同種類、キー1、キー2のデータで、 種類にnullが含まれていたら、nullのデータは取得しない 2)同種類、キー1、キー2のデータで、 種類にnullしかないデータは、取得する 001 aaa bbb 001 aaa ccc 001 aaa ddd 002 aaa bbb 002 aaa ccc null aaa ddd →いる null aaa bbb →いらない null aaa ccc →いらない ↓結果 001 aaa ccc 001 aaa ddd 002 aaa bbb 002 aaa ccc null aaa ddd 上記を実現する為、union後のsqlでも構わないので、 一発のsqlで取得する事は可能でしょうか? 有識者の方にご享受頂ければ幸いです。 どうぞ宜しくお願い申し上げます。
回答: 補足ありがとうございます。 ということは >001 aaa ddd があって >null aaa ddd もあるというのは間違っていますよね。 ですので、以下のデータと結果を正として考えます。 --データ 001 aaa bbb 001 aaa ccc 001 aaa ddd 002 aaa bbb 002 aaa ccc null aaa eee --dddをeeeに変えました null aaa bbb null aaa ccc --結果 001 aaa bbb 001 aaa ccc 001 aaa ddd 002 aaa bbb 002 aaa ccc null aaa eee 以下のsqlでどうでしょうか。 select 種類,キー1,キー2 from ( select 種類,キー1,キー2,count(*) over(partition by キー1,キー2) cnt from ( select 種類,キー1,キー2 from table1 union select 種類,キー1,キー2 from table2 union select 種類,キー1,キー2 from table3 ) ) where 種類 is not null or cnt = 1 order by 種類,キー1,キー2; 全角スペースでインデントしているので、実行時には削除するか半角スペースに置き換えるなどしてください。