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.

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.
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.
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.
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.
.innerJoin(posts, eq(users.id, posts.authorId))import { and, eq } from 'drizzle-orm'
.innerJoin(posts, and(
eq(users.id, posts.authorId),
eq(posts.status, 'published')
))import { sql } from 'drizzle-orm'
.innerJoin(posts, sql`${users.id} = ${posts.authorId} AND ${posts.publishedAt} > ${dateThreshold}`)const result = await db.query.users.findMany({
with: { posts: true },
})
// Data nested: { name: "...", posts: [...] }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.
Pada episode 8 ini, kalian telah memahami SQL-like JOIN Queries:
sql.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!