You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用CTE关联无关联表的SELECT结果批量插入关联表?

解决方案:用CTE+交叉连接实现无关联表的批量插入

核心思路

因为两张源表没有关联关系,要实现所有目标员工与目标分类的配对,使用**交叉连接(CROSS JOIN)**可以自动生成所有可能的组合,再结合CTE封装两个查询逻辑,就能实现一键插入。

基础版SQL(不处理重复)

如果不需要担心employees_categories表中已有重复的关联记录,可以直接使用以下代码:

WITH london_employees AS (
    SELECT employee_id FROM employees
    WHERE city = 'London'
),
dairy_categories AS (
    SELECT category_id FROM categories
    WHERE category_name ILIKE 'dairy%'
)
INSERT INTO employees_categories (employee_id, category_id)
SELECT le.employee_id, dc.category_id
FROM london_employees le
CROSS JOIN dairy_categories dc;

这段代码会将所有伦敦员工的employee_id与所有匹配dairy%的category_id逐一配对,插入到关联表中。

防重复版SQL

如果需要避免插入已存在的关联记录,可以根据表结构选择以下两种方式:

方式1:利用唯一约束(推荐)

如果employees_categories表已创建(employee_id, category_id)的唯一约束,使用ON CONFLICT语法跳过重复记录:

WITH london_employees AS (
    SELECT employee_id FROM employees
    WHERE city = 'London'
),
dairy_categories AS (
    SELECT category_id FROM categories
    WHERE category_name ILIKE 'dairy%'
)
INSERT INTO employees_categories (employee_id, category_id)
SELECT le.employee_id, dc.category_id
FROM london_employees le
CROSS JOIN dairy_categories dc
ON CONFLICT (employee_id, category_id) DO NOTHING;

方式2:用NOT EXISTS过滤

如果没有唯一约束,通过子查询检查已存在的记录:

WITH london_employees AS (
    SELECT employee_id FROM employees
    WHERE city = 'London'
),
dairy_categories AS (
    SELECT category_id FROM categories
    WHERE category_name ILIKE 'dairy%'
)
INSERT INTO employees_categories (employee_id, category_id)
SELECT le.employee_id, dc.category_id
FROM london_employees le
CROSS JOIN dairy_categories dc
WHERE NOT EXISTS (
    SELECT 1 FROM employees_categories ec
    WHERE ec.employee_id = le.employee_id
      AND ec.category_id = dc.category_id
);

内容的提问来源于stack exchange,提问作者Avery Freeman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 03:43:25