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

如何借助WITH子句消除SQL查询中job_id in ('1','2')的重复使用

嘿,这问题我太懂了!咱们可以用WITH子句(也就是CTE,公共表表达式)把重复的过滤条件抽出来,一次性定义好符合job_id IN ('1','2')的数据集,之后所有需要用到这个数据集的地方直接引用就行,彻底告别重复写条件的麻烦。

举个实际例子对比

先看一下原来带有重复条件的查询(比如两次用到WHERE job_id IN ('1','2')):

-- 原查询:重复写了两次job_id过滤条件
SELECT * 
FROM employees
WHERE job_id IN ('1','2')
AND salary > (SELECT AVG(salary) FROM employees WHERE job_id IN ('1','2'));

再看用WITH子句改造后的版本:

WITH filtered_employees AS (
    -- 这里一次性过滤出符合job_id条件的所有数据
    SELECT * 
    FROM employees
    WHERE job_id IN ('1','2')
)
-- 后续所有查询都直接用这个预过滤好的数据集
SELECT * 
FROM filtered_employees
WHERE salary > (SELECT AVG(salary) FROM filtered_employees);
多场景适配:多个子查询重复用条件的情况

如果你的查询里有多个子查询都用到了这个job_id过滤条件,比如这样:

-- 原查询:多个子查询重复写job_id条件
SELECT 
    (SELECT COUNT(*) FROM employees WHERE job_id IN ('1','2') AND department_id = 10) AS dept10_count,
    (SELECT COUNT(*) FROM employees WHERE job_id IN ('1','2') AND department_id = 20) AS dept20_count,
    (SELECT AVG(salary) FROM employees WHERE job_id IN ('1','2')) AS avg_salary;

用WITH改造后会更简洁,而且维护起来更方便——以后要修改job_id的取值,只需要在CTE里改一次就行:

WITH filtered_employees AS (
    SELECT * 
    FROM employees
    WHERE job_id IN ('1','2')
)
SELECT 
    (SELECT COUNT(*) FROM filtered_employees WHERE department_id = 10) AS dept10_count,
    (SELECT COUNT(*) FROM filtered_employees WHERE department_id = 20) AS dept20_count,
    (SELECT AVG(salary) FROM filtered_employees) AS avg_salary;
小提示

WITH子句定义的CTE是临时的,只在当前查询中有效,不会创建持久化的表,而且主流数据库(MySQL 8.0+、PostgreSQL、SQL Server、Oracle等)都支持这个语法,放心用就行~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:47:41