Turso
🚀 Drizzle 为您提供 Turso Scaler 和 Pro 1 年期 9 折优惠 🚀
Payload
SQLite Cloud
SingleStore
Lokalise
Replit
Sentry

集合操作

SQL 集合操作将多个查询块的结果合并为一个结果。SQL 标准定义了以下三种集合操作:UNION(并集)、INTERSECT(交集)、EXCEPT(差集),以及它们的 ALL 版本:UNION ALL(并集所有)、INTERSECT ALL(交集所有)、EXCEPT ALL(差集所有)。

并集

将两个查询块的所有结果合并为一个结果,并省略所有重复项。

从 customers 表和 users 表中获取所有名称,不含重复项。

PostgreSQL
MySQL
SQLite
SingleStore
import-pattern
builder-pattern
schema.ts
import { union } from 'drizzle-orm/pg-core'
import { users, customers } from './schema'

const allNamesForUserQuery = db.select({ name: users.name }).from(users);

const result = await union(
	allNamesForUserQuery,
	db.select({ name: customers.name }).from(customers)
).limit(10);
(select "name" from "sellers")
union
(select "name" from "customers")
limit $1

并集所有

将两个查询块的所有结果合并为一个结果,包含重复项。

假设您有两个表,一个表示线上销售,另一个表示店内销售。在这种情况下,您希望将两个表中的数据合并到一个结果集中。由于可能存在重复交易,您希望保留所有记录而不消除重复项。

PostgreSQL
MySQL
SQLite
SingleStore
import-pattern
builder-pattern
schema.ts
import { unionAll } from 'drizzle-orm/pg-core'
import { onlineSales, inStoreSales } from './schema'

const onlineTransactions = db.select({ transaction: onlineSales.transactionId }).from(onlineSales);
const inStoreTransactions = db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales);

const result = await unionAll(onlineTransactions, inStoreTransactions);
select "transaction_id" from "online_sales"
union all
select "transaction_id" from "in_store_sales"

交集

只合并两个查询块结果中共同的行,并省略所有重复项。

假设您有两个表,存储了学生课程注册信息。您想找出两个不同系之间共同的课程,但您只想要唯一的课程名称,并且不关心同一学生多次注册同一课程的情况。

在这种情况下,您想找出两个系之间共同的课程,但即使同一系有多个学生注册了同一课程,您也不想多次计数同一课程。

PostgreSQL
MySQL
SQLite
SingleStore
import-pattern
builder-pattern
schema.ts
import { intersect } from 'drizzle-orm/pg-core'
import { depA, depB } from './schema'

const departmentACourses = db.select({ courseName: depA.courseName }).from(depA);
const departmentBCourses = db.select({ courseName: depB.courseName }).from(depB);

const result = await intersect(departmentACourses, departmentBCourses);
select "course_name" from "department_a_courses"
intersect
select "course_name" from "department_b_courses"

交集所有

只合并两个查询块结果中共同的行,包含重复项。

假设您有两个表,其中包含客户订单数据,您想找出普通客户和 VIP 客户都订购过的产品。在这种情况下,您希望跟踪每种产品的数量,即使不同客户多次订购了同一产品。

在这种情况下,您想找出普通客户和 VIP 客户都订购过的产品,但您希望保留数量信息,即使不同客户多次订购了同一产品。

PostgreSQL
MySQL
SingleStore
import-pattern
builder-pattern
schema.ts
import { intersectAll } from 'drizzle-orm/pg-core'
import { regularCustomerOrders, vipCustomerOrders } from './schema'

const regularOrders = db.select({ 
    productId: regularCustomerOrders.productId,
    quantityOrdered: regularCustomerOrders.quantityOrdered }
).from(regularCustomerOrders);

const vipOrders = db.select({ 
    productId: vipCustomerOrders.productId,
    quantityOrdered: vipCustomerOrders.quantityOrdered }
).from(vipCustomerOrders);

const result = await intersectAll(regularOrders, vipOrders);
select "product_id", "quantity_ordered" from "regular_customer_orders"
intersect all
select "product_id", "quantity_ordered" from "vip_customer_orders"

差集

对于两个查询块 A 和 B,返回 A 中存在但 B 中不存在的所有结果,并省略所有重复项。

假设您有两个表,存储了员工的项目分配信息。您想找出某个部门独有的项目,不与其他部门共享,并排除重复项。

在这种情况下,您想识别某个部门独有且不与其他部门共享的项目。您不想多次计数同一个项目,即使同一部门的多个员工被分配到该项目。

PostgreSQL
MySQL
SQLite
SingleStore
import-pattern
builder-pattern
schema.ts
import { except } from 'drizzle-orm/pg-core'
import { depA, depB } from './schema'

const departmentACourses = db.select({ courseName: depA.projectsName }).from(depA);
const departmentBCourses = db.select({ courseName: depB.projectsName }).from(depB);

const result = await except(departmentACourses, departmentBCourses);
select "projects_name" from "department_a_projects"
except
select "projects_name" from "department_b_projects"

差集所有

对于两个查询块 A 和 B,返回 A 中存在但 B 中不存在的所有结果,包含重复项。

假设您有两个表,其中包含客户订单数据,您想找出普通客户(不含 VIP 客户)独家订购的产品。在这种情况下,您希望跟踪每种产品的数量,即使不同普通客户多次订购了同一产品。

在这种情况下,您想找出普通客户独家订购且 VIP 客户未订购的产品。您希望保留数量信息,即使同一产品被不同普通客户多次订购。

PostgreSQL
MySQL
SingleStore
import-pattern
builder-pattern
schema.ts
import { exceptAll } from 'drizzle-orm/pg-core'
import { regularCustomerOrders, vipCustomerOrders } from './schema'

const regularOrders = db.select({ 
    productId: regularCustomerOrders.productId,
    quantityOrdered: regularCustomerOrders.quantityOrdered }
).from(regularCustomerOrders);

const vipOrders = db.select({ 
    productId: vipCustomerOrders.productId,
    quantityOrdered: vipCustomerOrders.quantityOrdered }
).from(vipCustomerOrders);

const result = await exceptAll(regularOrders, vipOrders);
select "product_id", "quantity_ordered" from "regular_customer_orders"
except all
select "product_id", "quantity_ordered" from "vip_customer_orders"