DBFlute: {tips} Union

こんな感じです。
MemberCB cb = new MemberCB();
cb.setupSelect_MemberStatus();

// 会員ステータスが「仮会員」であること
cb.query().setMemberStatusCode_Equal_Provisional();

// Union for 会員名が「St」で始まっていること
cb.union(new UnionQuery<MemberCB>() {
    public void query(MemberCB unionCB) {
        unionCB.query().setMemberName_PrefixSearch("St");
    }
});

cb.query().addOrderBy_MemberName_Desc();
<OR句の代替>
OR句の代替として利用できます。
最新DBでは気を利かせてくれることもありますが、
基本的にはORはUNIONにした方がINDEXの利用の点で優位です。
(そいういうこともあり、CBは必ずORをUNIONで代替します)

<UNION ALL>
cb.unionAll()で「union all」になります。
条件的に重複がないことがわかっているなら
こっちの方が良いです。
(union結果の重複の消し込み処理をしないため)

<結合取得(setupSelect)の指定>
cb.setupSelect_Xxx();
は、自動でUnion側のCBに伝達されますので、
UnionQueryのCBでは指定する必要はありません。
(Select句は完全に一致させなければならないのですし)

<フォーマット>
UnionしてもCBで発行されるSQLはしっかり整形されてます。
以下のような感じでログに出力されます。
select dflocal.MEMBER_ID as MEMBER_ID, ...(略)
  from MEMBER dflocal
    left outer join MEMBER_STATUS dfrelation_0 on ...(略)
 where dflocal.MEMBER_STATUS_CODE = 'PRV'
 union 
select dflocal.MEMBER_ID as MEMBER_ID, ...
  from MEMBER dflocal
    left outer join MEMBER_STATUS dfrelation_0 on ...(略)
 where dflocal.MEMBER_NAME like 'St%' 
 order by MEMBER_NAME desc