Features / Select

Use queries as named subqueries with .as()

Give a select or relational query a name so its selected fields can be referenced from another query with type-safe aliases.

Enable it

import { eq } from 'drizzle-orm'
import 'drizzle-plus/pg/as'
// or 'drizzle-plus/mysql/as'
// or 'drizzle-plus/sqlite/as'

Alias a select query

Select the fields first, then call .as(alias):

const activeUsers = db
  .select({
    id: user.id,
    name: user.name,
  })
  .from(user)
  .where(eq(user.active, true))
  .as('active_users')

const rows = await db
  .select({ id: activeUsers.id, name: activeUsers.name })
  .from(activeUsers)

The alias becomes the table name in the outer SQL query, and the selected field decoders are carried into the outer result.

Alias a relational query

Relational queries can be used the same way:

const recentUsers = db.query.user
  .findMany({
    columns: {
      id: true,
      name: true,
    },
    limit: 10,
  })
  .as('recent_users')

const rows = await db
  .select({ id: recentUsers.id, name: recentUsers.name })
  .from(recentUsers)

The source query must have a selection. An unselected db.select() cannot be aliased because there are no fields to expose.

The $values() helper also exposes .as() for its generated columns, and upsert can expose its returned fields as a subquery when it is composed into a larger statement.