@@ -15,21 +15,31 @@ type SelectStatement interface {
1515 From (table ... string )
1616 FromSelect (f func (b SelectStatement ), as string )
1717 FromValues (f func (b Values ), as string )
18+
1819 Join (table string ) Join
1920 InnerJoin (table string ) Join
2021 FullOuterJoin (table string ) Join
2122 LeftJoin (table string ) Join
2223 RightJoin (table string ) Join
24+
2325 JoinSelect (f func (b SelectStatement ), as string ) Join
2426 InnerJoinSelect (f func (b SelectStatement ), as string ) Join
2527 FullOuterJoinSelect (f func (b SelectStatement ), as string ) Join
2628 LeftJoinSelect (f func (b SelectStatement ), as string ) Join
2729 RightJoinSelect (f func (b SelectStatement ), as string ) Join
30+
2831 JoinLateralSelect (f func (b SelectStatement ), as string ) Join
2932 InnerJoinLateralSelect (f func (b SelectStatement ), as string ) Join
3033 FullOuterJoinLateralSelect (f func (b SelectStatement ), as string ) Join
3134 LeftJoinLateralSelect (f func (b SelectStatement ), as string ) Join
3235 RightJoinLateralSelect (f func (b SelectStatement ), as string ) Join
36+
37+ JoinUnion (f func (b UnionStatement ), as string ) Join
38+ InnerJoinUnion (f func (b UnionStatement ), as string ) Join
39+ FullOuterJoinUnion (f func (b UnionStatement ), as string ) Join
40+ LeftJoinUnion (f func (b UnionStatement ), as string ) Join
41+ RightJoinUnion (f func (b UnionStatement ), as string ) Join
42+
3343 Where (f func (b Cond ))
3444 GroupBy (col ... string )
3545 Having (f func (b Cond ))
@@ -217,6 +227,44 @@ func (st *selectStmt) RightJoinLateralSelect(f func(b SelectStatement), as strin
217227 return st .joinSelect ("right join lateral" , f , as )
218228}
219229
230+ func (st * selectStmt ) joinUnion (typ string , f func (b UnionStatement ), as string ) Join {
231+ var x unionStmt
232+ f (& x )
233+
234+ var b buffer
235+ b .push (paren (x .make ()))
236+ if as != "" {
237+ b .push (as )
238+ }
239+
240+ j := join {
241+ typ : typ ,
242+ table : & b ,
243+ }
244+ st .joins .push (& j )
245+ return & j
246+ }
247+
248+ func (st * selectStmt ) JoinUnion (f func (b UnionStatement ), as string ) Join {
249+ return st .joinUnion ("join" , f , as )
250+ }
251+
252+ func (st * selectStmt ) InnerJoinUnion (f func (b UnionStatement ), as string ) Join {
253+ return st .joinUnion ("inner join" , f , as )
254+ }
255+
256+ func (st * selectStmt ) FullOuterJoinUnion (f func (b UnionStatement ), as string ) Join {
257+ return st .joinUnion ("full outer join" , f , as )
258+ }
259+
260+ func (st * selectStmt ) LeftJoinUnion (f func (b UnionStatement ), as string ) Join {
261+ return st .joinUnion ("left join" , f , as )
262+ }
263+
264+ func (st * selectStmt ) RightJoinUnion (f func (b UnionStatement ), as string ) Join {
265+ return st .joinUnion ("right join" , f , as )
266+ }
267+
220268func (st * selectStmt ) Where (f func (b Cond )) {
221269 f (& st .where )
222270}
0 commit comments