with的用法小结

一:关于with你要知道的是:

1. with子句的返回结果存到用户的临时表空间中,只做一次查询,反复使用,提高效率。

2. 如果定义了with子句,而在查询中不使用,那么会报ora-32035 错误:未引用在with子 句中定义的查询名。

3. 前面的with子句定义的查询在后面的with子句中可以使用。但是一个with子句内部不能 嵌套with子句。

4. 当一个查询块名字和一个表名或其他的对象相同时,解析器从内向外搜索,优先使用子 查询块名字。

5. with 查询的结果列有别名,引用的时候必须使用别名或*。

6. with 有可能影响执行计划。

二:语法结构

with a as (select子句) ,

a1 as(select子句2)...

select....

三:案例

1.查询部门名称包含A的所有员工的信息

SQL1:

with a as(select deptno from dept where dname like '%A%') select * from emp where deptno in (select * from a)

2.查询部门名称包含A且部门编号大于20的所有员工的信息

SQL1:

with a as(select deptno from dept where dname like '%A%'),

a2 as (select deptno from a where deptno>20) select * from  emp where deptno in (select * from a2)

SQL2:

with a1 as(select deptno from dept where dname like '%A%') select * from emp where deptno in (

with a2 as (select * from a1 where deptno>20) select * from a2

)



with在优化sql的时候作用显著,须得好好研究



### PostgreSQL 中 WITH 子句的使用方法 `WITH` 子句在 PostgreSQL 中用于创建通用表表达式(Common Table Expression, CTE)。CTE 是一种临时的结果集,可以在查询期间多次重用。它可以简化复杂查询并提高可读性。 以下是 `WITH` 子句的基本语法: ```sql WITH cte_name AS ( -- 定义子查询部分 SELECT ... ) SELECT ... FROM cte_name; ``` #### 示例 1:基本用法 下面是一个简单的例子,展示如何通过 `WITH` 创建一个 CTE 并在其后的查询中使用它[^2]。 ```sql WITH w1 AS ( SELECT id, name FROM t_table WHERE id = 1 ) SELECT * FROM w1; ``` 在这个例子中,`w1` 被定义为一个 CTE,其内容是从 `t_table` 表中筛选出 `id=1` 的记录。随后,在主查询中可以直接引用 `w1` 来获取这些数据。 --- #### 示例 2:多个 CTE 的组合 可以同时定义多个 CTE,并在一个查询中联合它们。以下示例展示了两个独立的 CTE (`w1`, `w2`) 如何结合在一起形成最终结果。 ```sql WITH w1 AS ( SELECT id, name FROM t_table WHERE id = 1 ), w2 AS ( SELECT id, name FROM t_table2 WHERE id = 1 ) SELECT tl.name, w1.name AS w1_name, w2.name AS w2_name FROM t_table3 AS tl JOIN w1 ON tl.id = w1.id JOIN w2 ON tl.id2 = w2.id; ``` 此查询首先分别从 `t_table` 和 `t_table2` 构建了两个 CTE (`w1` 和 `w2`),然后将这两个 CTE 结果与另一个表 `t_table3` 进行连接操作,从而生成所需的数据集合。 --- #### 示例 3:递归查询 除了普通的非递归形式外,`WITH` 还支持递归查询。这种功能特别适合处理树形结构或层次化数据[^3]。 假设有一个员工表 `employees`,其中包含字段 `employee_id` 和 `manager_id`,表示每位员工及其上级的关系。可以通过如下方式构建递归查询来查找某个员工的所有下属: ```sql WITH RECURSIVE subordinates AS ( -- 基础情况:找到初始节点 SELECT employee_id, manager_id, name FROM employees WHERE manager_id = 1 UNION ALL -- 递归条件:继续向下扩展 SELECT e.employee_id, e.manager_id, e.name FROM employees e INNER JOIN subordinates s ON e.manager_id = s.employee_id ) SELECT * FROM subordinates; ``` 在此递归查询中,第一次执行的是基础查询部分;之后每次迭代都会基于上一次的结果进一步展开直到满足终止条件为止。 --- ### 总结 `WITH` 子句不仅能够帮助拆分复杂的 SQL 查询逻辑使其更加清晰易懂,而且还能有效减少重复计算提升性能效率。无论是简单还是高级场景下都具有广泛的应用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值