Dew

Set Operations

UNION, UNION ALL, INTERSECT, and EXCEPT.

Set operations combine results from multiple SELECT queries.

UNION / UNION ALL

admins := Users.From(db).Select(Users.Name).Where(Users.Role.Eq("admin"))
mods := Users.From(db).Select(Users.Name).Where(Users.Role.Eq("mod"))

// UNION (deduplicated)
users, err := dew.Union[User](db, admins, mods).All()

// UNION ALL (with duplicates)
users, err := dew.UnionAll[User](db, admins, mods).All()

INTERSECT / EXCEPT

active := Users.From(db).Select(Users.Name).Where(Users.Active.IsTrue())
premium := Users.From(db).Select(Users.Name).Where(Users.Plan.Eq("premium"))

// Rows in both queries
users, err := dew.Intersect[User](db, active, premium).All()

// Rows in first but not second
users, err := dew.Except[User](db, active, premium).All()

Chaining

Chain multiple set operations:

admins := Users.From(db).Select(Users.Name).Where(Users.Role.Eq("admin"))
mods := Users.From(db).Select(Users.Name).Where(Users.Role.Eq("mod"))
editors := Users.From(db).Select(Users.Name).Where(Users.Role.Eq("editor"))

users, err := dew.Union[User](db, admins, mods).
    UnionAll(editors).
    All()
// (SELECT ... WHERE role = $1) UNION (SELECT ... WHERE role = $2) UNION ALL (SELECT ... WHERE role = $3)

ORDER BY, LIMIT, OFFSET

Applied to the combined result:

users, err := dew.UnionAll[User](db, admins, mods).
    OrderBy(dew.Asc(dew.Raw("name"))).
    Limit(10).
    Offset(5).
    All()

As subquery or CTE body

SetQuery implements Expression, so it composes with CTEs and subquery FROM:

combined := dew.Union[User](db, admins, mods)

// As CTE
users, err := dew.From[User](db, dew.TableRef("staff")).
    With(dew.CTE("staff", combined)).
    All()

// As subquery FROM
users, err := dew.FromSub[User](db, combined, "staff").
    Where(dew.Raw("staff.age > ?", 25)).
    All()

ToSql

sql, args := dew.Union[User](db, admins, mods).ToSql()

Constructors

FunctionSQL
dew.Union[T](db, left, right)UNION
dew.UnionAll[T](db, left, right)UNION ALL
dew.Intersect[T](db, left, right)INTERSECT
dew.Except[T](db, left, right)EXCEPT

On this page