
SQL之with子句
发布日期:2021-05-07 22:37:48
浏览次数:25
分类:精选文章
本文共 3076 字,大约阅读时间需要 10 分钟。
with 语句
with 语句相当于建立了一张 临时虚拟表
即利用with子句为子查询的数据集作为一个内存临时表. 在内存中解析,提高执行效率.,并且提高SQL语句的可读性,用完即销毁。
语法
可以同时定义多个临时表
With Subtable1 as (select 1...), //as和select中的括号都不能省略 Subtable2 as (select 2...), //后面的没有with,逗号分割,同一个主查询同级别地方,with子查询只能定义一次 … Subtablen as (select n...) //与下面的实际查询之间没有逗号Select ….
引用
例子
以下内容引用自
with Q1 as (select product_id, product_name from products where rownum <= 10)select * from Q1 ; //使用Q1//查询结果 product_id product_name 1797 Inkjet C/8/HQ 2459 LaserPro 1200/8/BW 3127 LaserPro 600/6/BW 2254 HD 10GB /I 3334 HD 12GB /R
Q1为括号的子查询的别名,相当于在内存里建立了1张临时表. 下面的select 语句就直接检索这张临时表
with子句后必须接着select 语句, 否则出错
with Q1 as (select product_id, product_name from products where rownum <= 10)delete from products where 1 =2 ;select * from products where 1 =2;
在第4行上开始执行命令时出错:with Q1 as (select product_id, product_name from products where rownum <= 10)delete from products where 1 =2 命令出错, 行: 17 列: 4错误报告:SQL 错误: ORA-00928: 缺失 SELECT 关键字00928. 00000 - "missing SELECT keyword"*Cause: *Action:未选择任何行
1个with子句里可以定义多个内存临时表, 而且可以互相使用
也就是说
with子句里其中1个内存临时表能被这个with子句内的其他内存临死表使用
WITH Q1 AS (SELECT 3 + 5 S FROM DUAL), Q2 AS (SELECT 3 * 5 M FROM DUAL), Q3 AS (SELECT S, M, S + M, S * M FROM Q1, Q2) SELECT * FROM Q3; S M S+M S*M---------- ---------- ---------- ---------- 8 15 23 120
with定义的内存临时表一旦被select 语句检索一次,系统就会在内存中清理掉这张临时表
也就是 用完即销毁
WITH Q1 AS (SELECT 3 + 5 S FROM DUAL), Q2 AS (SELECT 3 * 5 M FROM DUAL), Q3 AS (SELECT S, M, S + M, S * M FROM Q1, Q2) SELECT * FROM Q3; SELECT * FROM Q2;
结果
ORA-00942: 表或视图不存在00942. 00000 - "table or view does not exist"*Cause: *Action:行 42 列 15 出错
Q2 已经被with里的Q3检索过一次, 被删掉了
with子句定义的临时表命不能于已存在的表名重复
with products as (select product_id, product_name from products where rownum <= 10) select * from products ;
在行 21 上开始执行命令时出错:with products as (select product_id, product_name from products where rownum <= 10) select * from products 命令出错, 行: 22 列: 54错误报告:SQL 错误: ORA-32039: 递归 WITH 子句必须具有列别名列表
案例


//构造子查询WITH r AS ( SELECT seller_id, item_id, RANK() OVER(PARTITION BY seller_id ORDER BY order_date) AS ranking FROM Orders), second AS ( SELECT seller_id, item_id FROM r WHERE ranking = 2)SELECT user_id AS seller_id, IF(item_brand = favorite_brand, 'yes', 'no') AS 2nd_item_fav_brandFROM Users LEFT JOIN second //使用子查询ON user_id = seller_id LEFT JOIN Items ON second.item_id = Items.item_id ```
发表评论
最新留言
不错!
[***.144.177.141]2025年03月23日 17时55分42秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
事务到底是隔离的还是不隔离的?
2021-05-07
@Import注解---导入资源
2021-05-07
解决ubuntu在虚拟机(VMware)环境下不能联网的问题
2021-05-07
二分查找与插入排序的结合使用
2021-05-07
892 三维形体的表面积(分析)
2021-05-07
40. 组合总和 II(dfs、set去重)
2021-05-07
16 最接近的三数之和(排序、双指针)
2021-05-07
279 完全平方数(bfs)
2021-05-07
410 分割数组的最大值(二分查找、动态规划)
2021-05-07
875 爱吃香蕉的珂珂(二分查找)
2021-05-07
450 删除二叉搜索树中的节点(递归删除节点)
2021-05-07
桌面图标的自动排列图标
2021-05-07
第十一届蓝桥杯python组第二场省赛-数字三角形
2021-05-07
数字三角形的无返回值的深度优先搜索解法
2021-05-07
完全背包问题的简化思路
2021-05-07
Jquery添加元素
2021-05-07
Jquery使用需要下载的文件
2021-05-07
Spring中如何传递参数的问题
2021-05-07
BST中某一层的所有节点(宽度优先搜索)
2021-05-07
广度优先搜索
2021-05-07