with as 用法

原语句:select * from person.StateProvince where CountryRegionCode in
(select CountryRegionCode from person.CountryRegion where Name like 'C%')

 

修改后:

with
cr as
(
select CountryRegionCode from person.CountryRegion where Name like 'C%'
)

select * from person.StateProvince where CountryRegionCode in (select * from cr)

 

with相当于一个临时表,优点是同一sql中多次调用的话不需要多次查询,感觉相当于定义了一个变量并赋值

### 3.1 WITH AS 的基本定义与作用 `WITH AS` 是 SQL 中的一种语法结构,也称为子查询部分(subquery factoring),用于定义一个可以在后续 SQL 语句中重复使用的临时结果集。该结构可以提高 SQL 语句的可读性,减少嵌套查询的复杂度,并在某些情况下优化执行性能。通过 `WITH AS`,可以将复杂的子查询提取出来,单独定义并命名,从而简化主查询逻辑[^1]。 例如,以下是一个使用 `WITH AS` 的简单示例: ```sql WITH A AS ( SELECT * FROM user ) SELECT * FROM A, customer WHERE customer.userid = A.id; ``` 此查询将 `user` 表的查询结果定义为临时表 `A`,并在主查询中引用它,避免了重复书写子查询的麻烦[^1]。 ### 3.2 WITH AS 在复杂查询中的应用 在涉及 `UNION ALL` 或多个重复子查询的场景中,`WITH AS` 能显著提升查询效率。如果某个子查询被多次引用,数据库优化器会自动将该结果集缓存到临时表中,避免重复执行相同查询。这种方式在处理大数据量或复杂逻辑时,可以显著减少资源消耗[^2]。 例如,以下 SQL 使用多个 CTE(Common Table Expression)进行数据整合: ```sql WITH cte1 AS ( SELECT * FROM table1 WHERE name LIKE 'abc%' ), cte2 AS ( SELECT * FROM table2 WHERE id > 20 ), cte3 AS ( SELECT * FROM table3 WHERE price < 100 ) SELECT a.* FROM cte1 a, cte2 b, cte3 c WHERE a.id = b.id AND a.id = c.id; ``` 该查询通过多个 CTE 的定义,分别筛选出不同表中的数据,并在主查询中进行关联操作,提高了代码的可读性和维护性[^4]。 ### 3.3 WITH AS 与性能优化 使用 `WITH AS` 时,数据库优化器可能会将结果集存储在临时表中,尤其是当某个 CTE 被多次引用时。这种行为有助于减少重复查询的开销,提升整体执行效率。此外,可以使用 `MATERIALIZED` 提示强制将结果缓存,从而进一步优化性能。 然而,`WITH AS` 并非总是最优选择。如果某个 CTE 只被引用一次,则不会被缓存,反而可能增加额外解析开销。因此,在实际使用中应根据具体场景权衡是否采用该结构[^3]。 ### 3.4 使用注意事项 - **避免重复调用**:虽然 `WITH AS` 支持多次引用,但若仅使用一次,则不会缓存结果,可能影响性能[^3]。 - **命名冲突**:CTE 的名称不能与现有表或视图冲突,否则可能导致查询错误。 - **作用域限制**:CTE 的作用域仅限于定义后的当前查询,不能跨语句使用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值