oracle中with as语句的使用

一. with as 简介:

with as其实就是一个子查询, 使用它可以增强sql的可读性,同时因为该查询只执行一次,并将结果存储在用户临时表空间中,

可以多次引用,增强性能。


二. with as 用法:

with as学名为公用表表达式 - CTE, 使用它需要注意以下几点:

1. cte后面必须直接跟使用cte的sql语句, 如:select、insert、update,否则cte将失效

with temp as (
     select * from xxx
)
select * from temp;

2. cte后面可以跟其他的cte,但只能使用一个with,多个cte中间使用逗号分隔:

with temp1 as (  
     select * from xxx  
),
temp2 as(
     select * from yyy
)
select x.* from temp1 x, temp2 y where x.id = y.id 

三. with as 实战:

查询出部门的总薪水大于所有部门平均总薪水的部门:

部门表s_dept, 员工表s_emp;

-- step1:查询出部门名和部门的总薪水
with dept_costs as(
  select a.name,sum(b.salary) dept_total
     from
   s_dept a,s_emp b
     where a.id=b.dept_id
     group by a.name
),

-- step2:利用上一个with查询的结果,计算部门的平均总薪水
avg_costs as(
  select sum(dept_total)/count(*) dept_avg
  from dept_costs
)

-- step3:从两个with查询中比较并且输出查询结果
select name,dept_total
   from dept_costs
where
dept_total > (
  select dept_avg from avg_costs
)
order by name;


### Oracle 数据库中 WITH AS 语句的用法 #### 使用场景 WITH AS 子查询因子(也称为公共表表达式 CTE)允许定义一个或多个临时的结果集,在整个查询期间可以多次引用。这种结构不仅提高了可读性和维护性,而且有助于性能优化[^1]。 #### 基本语法 ```sql WITH temp_table_name (column_list) AS ( SELECT column_list FROM table_expression ) SELECT * FROM temp_table_name; ``` 这里 `temp_table_name` 是给定的一个名称用于指代由子查询产生的结果集;而括号内的部分则列出了这个虚拟表格中的字段名列表。如果省略此参数,则默认采用子查询返回的第一行作为列标题。 #### 实际应用案例 ##### 场景一:复杂计算分步处理 当面对多层嵌套或者重复使用的子查询时,可以通过 WITH 来简化代码并提高效率。 ```sql WITH sales_summary AS ( SELECT region, SUM(amount_sold) total_sales FROM sales GROUP BY region ), profit_calculation AS ( SELECT s.region, s.total_sales - c.costs net_profit FROM sales_summary s JOIN costs c ON s.region = c.region ) SELECT * FROM profit_calculation; ``` 上述例子展示了如何先汇总销售数据再与成本信息关联求得净利润的过程。 ##### 场景二:递归查询树形结构 对于具有层次关系的数据模型来说,WITH RECURSIVE 提供了一种优雅的方式来遍历父子节点之间的路径。 ```sql WITH RECURSIVE employee_hierarchy(emp_id, emp_name, manager_id, level) AS ( -- 锚成员: 获取顶层员工(无上级管理者) SELECT e.emp_id, e.emp_name, e.manager_id, 0 FROM employees e WHERE e.manager_id IS NULL UNION ALL -- 递归成员: 追加下级职员及其对应的级别编号 SELECT e.emp_id, e.emp_name, e.manager_id, eh.level + 1 FROM employees e INNER JOIN employee_hierarchy eh ON e.manager_id = eh.emp_id ) -- 输出完整的组织架构图 SELECT * FROM employee_hierarchy ORDER BY level ASC; ``` 这段脚本能够构建起从最高管理层到基层雇员间的完整链条,并按等级顺序展示出来。 #### 性能优势 适当运用 WITH 可以减少冗余操作次数,尤其是在涉及大量相同条件过滤的情况下尤为明显。此外,它还使得数据库引擎有机会更好地理解用户的意图从而做出更合理的执行计划选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值