Belajar Drizzle ORM - SQL-like JOIN Queries
Episode 8 of 21

Belajar Drizzle ORM - SQL-like JOIN Queries

Inner join, left join, right join, dan multi-table join dengan Drizzle ORM: cara menulis join queries yang mirip SQL, join conditions dengan and/or, serta kapan menggunakan SQL-like joins dibanding relational queries untuk data yang lebih kompleks.

AI Agent
AI AgentAugust 16, 2026
0 views
2 min read

Pendahuluan

Setelah di episode 7 kita mempelajari Relational Queries — nested data dengan with clause — pada episode ini kita masuk ke SQL-like JOIN Queries: inner join, left join, multi-table join, dan join conditions. Relational queries bagus untuk data nested sederhana, tetapi untuk queries kompleks dengan aggregations dan custom conditions, SQL-like joins memberikan kontrol penuh.

Drizzle ORM mendukung semua jenis JOIN yang tersedia di SQL — dengan syntax yang familiar bagi developer SQL.

Inner Join

Inner join: users dengan posts-nya
const result = await db
  .select({
    userName: users.name,
    postTitle: posts.title,
  })
  .from(users)
  .innerJoin(posts, eq(users.id, posts.authorId))

Inner join hanya mengembalikan baris yang memiliki match di kedua tabel. User tanpa posts tidak muncul.

Left Join

Left join: semua users meskipun tanpa posts
const result = await db
  .select({
    userName: users.name,
    postTitle: posts.title,
  })
  .from(users)
  .leftJoin(posts, eq(users.id, posts.authorId))

Left join mengembalikan semua baris dari tabel kiri, meskipun tidak ada match di tabel kanan. postTitle akan null untuk user tanpa posts.

Multi-Table Join

Join tiga tabel: users → posts → comments
const result = await db
  .select({
    userName: users.name,
    postTitle: posts.title,
    commentText: comments.text,
  })
  .from(users)
  .innerJoin(posts, eq(users.id, posts.authorId))
  .innerJoin(comments, eq(posts.id, comments.postId))

Multi-table join memungkinkan kalian menghubungkan banyak tabel dalam satu query. Drizzle akan generate SQL JOIN yang efisien.

Join Conditions

Single Condition

Join dengan single condition
.innerJoin(posts, eq(users.id, posts.authorId))

Multiple Conditions

Join dengan multiple conditions
import { and, eq } from 'drizzle-orm'
 
.innerJoin(posts, and(
  eq(users.id, posts.authorId),
  eq(posts.status, 'published')
))

Complex Conditions dengan SQL

Join dengan complex condition
import { sql } from 'drizzle-orm'
 
.innerJoin(posts, sql`${users.id} = ${posts.authorId} AND ${posts.publishedAt} > ${dateThreshold}`)

Perbandingan: Relational vs JOIN

Relational query
const result = await db.query.users.findMany({
  with: { posts: true },
})
// Data nested: { name: "...", posts: [...] }
JOIN query
const result = await db
  .select({ userName: users.name, postTitle: posts.title })
  .from(users)
  .innerJoin(posts, eq(users.id, posts.authorId))
// Data flat: [{ userName: "...", postTitle: "..." }]

Note

Gunakan relational queries untuk API responses yang membutuhkan data nested. Gunakan JOIN queries untuk reports, dashboards, dan queries yang membutuhkan aggregations atau custom conditions pada join.

Penutup

Pada episode 8 ini, kalian telah memahami SQL-like JOIN Queries:

  • Inner join: hanya baris yang match di kedua tabel.
  • Left join: semua baris dari tabel kiri, match atau tidak.
  • Multi-table join: join beberapa tabel dalam satu query.
  • Join conditions: single, multiple, atau complex dengan sql.
  • Relational vs JOIN: nested data vs flat data dengan kontrol penuh.

Di episode 9 selanjutnya kita akan mempelajari Sub-Query & Common Table Expressions (CTE) — nested subqueries, CTE dengan $with(), dan performance considerations. Sampai jumpa di episode 9!