diff --git a/dialect/sql/builder.go b/dialect/sql/builder.go index 2f5fad874..de2e87a45 100644 --- a/dialect/sql/builder.go +++ b/dialect/sql/builder.go @@ -2331,6 +2331,11 @@ func (s *Selector) RightJoin(t TableView) *Selector { return s.join("RIGHT JOIN", t) } +// FullJoin appends a `FULL JOIN` clause to the statement. +func (s *Selector) FullJoin(t TableView) *Selector { + return s.join("FULL JOIN", t) +} + // join adds a join table to the selector with the given kind. func (s *Selector) join(kind string, t TableView) *Selector { s.joins = append(s.joins, join{ diff --git a/dialect/sql/builder_test.go b/dialect/sql/builder_test.go index 7e8a183c0..ad7690563 100644 --- a/dialect/sql/builder_test.go +++ b/dialect/sql/builder_test.go @@ -853,6 +853,18 @@ func TestBuilder(t *testing.T) { }(), wantQuery: "SELECT `g`.`id`, COUNT(`*`) AS `user_count` FROM `groups` AS `g` RIGHT JOIN `user_groups` AS `ug` ON `g`.`id` = `ug`.`group_id` GROUP BY `g`.`id`", }, + { + input: func() Querier { + t1 := Table("groups").As("g") + t2 := Table("user_groups").As("ug") + return Select(t1.C("id"), As(Count("`*`"), "user_count")). + From(t1). + FullJoin(t2). + On(t1.C("id"), t2.C("group_id")). + GroupBy(t1.C("id")) + }(), + wantQuery: "SELECT `g`.`id`, COUNT(`*`) AS `user_count` FROM `groups` AS `g` FULL JOIN `user_groups` AS `ug` ON `g`.`id` = `ug`.`group_id` GROUP BY `g`.`id`", + }, { input: func() Querier { t1 := Table("users").As("u")