当前位置: 首页 > news >正文

日照网络推广优化大师win7

日照网络推广,优化大师win7,武汉做网站的价格,网站建设与推广策划案案例postgresql 的递归查询功能很强大,可以实现传统 sql 无法实现的事情。那递归查询的执行逻辑是什么呢?在递归查询中,我们一般会用到 union 或者 union all,他们两者之间的区别是什么呢? 递归查询的执行逻辑 递归查询的…

postgresql 的递归查询功能很强大,可以实现传统 sql 无法实现的事情。那递归查询的执行逻辑是什么呢?在递归查询中,我们一般会用到 union 或者 union all,他们两者之间的区别是什么呢?

递归查询的执行逻辑

递归查询的基本语法如下

WITH RECURSIVE ctename AS (SELECT /* non-recursive branch, cannot reference "ctename" */UNION [ALL]SELECT /* recursive branch referencing "ctename" */
)
SELECT ...
FROM ctename ...

其本身也是一个CTE,可以将复杂的查询逻辑进行分离,让整个查询的逻辑更加清晰。对于递归查询而言,分为两部分:

  1. 非递归部分。即例子中的 UNION [ALL] 的上半部分
  2. 递归部分。即例子中的 UNION [ALL] 的下半部分

递归查询的逻辑如下:

  1. 计算非递归部分,其结果将作为递归查询的数据集,也是初始数据集
  2. 在第一步计算出来的数据上,执行递归部分,新查询出的数据将作为下次递归执行的数据集。也就是说,每次递归使用的数据集都是上次递归的结果
  3. 直到没有新的数据产生后,递归结束
  4. 将每一次递归的数据进行聚合,就拿到了最终的数据集

UNION 和 UNION ALL

  1. UNION: 会将本次递归查询到的数据进行内部去重,也会和之前递归查询出的数据进行去重
  2. UNION ALL: 不会对数据进行去重

举个例子

// 创建表
create table document_directories
(id         bigserial                                          not null,name       text                                               not null,created_at timestamp with time zone default CURRENT_TIMESTAMP not null,updated_at timestamp with time zone default CURRENT_TIMESTAMP not null,parent_id  bigint                   default 0                 not null
);// 插入示例数据,有两条数据是一样的
INSERT INTO public.document_directories (id, name, created_at, updated_at, parent_id) VALUES (1, '中国', '2020-03-28 15:55:27.137439', '2020-03-28 15:55:27.137439', 0);
INSERT INTO public.document_directories (id, name, created_at, updated_at, parent_id) VALUES (2, '上海', '2020-03-28 15:55:40.894773', '2020-03-28 15:55:40.894773', 1);
INSERT INTO public.document_directories (id, name, created_at, updated_at, parent_id) VALUES (3, '北京', '2020-03-28 15:55:53.631493', '2020-03-28 15:55:53.631493', 1);
INSERT INTO public.document_directories (id, name, created_at, updated_at, parent_id) VALUES (4, '南京', '2020-03-28 15:56:05.496985', '2020-03-28 15:56:05.496985', 1);
INSERT INTO public.document_directories (id, name, created_at, updated_at, parent_id) VALUES (5, '浦东新区', '2020-03-28 15:56:24.824672', '2020-03-28 15:56:24.824672', 2);
INSERT INTO public.document_directories (id, name, created_at, updated_at, parent_id) VALUES (6, '徐汇区', '2020-03-28 15:56:39.664924', '2020-03-28 15:56:39.664924', 2);
INSERT INTO public.document_directories (id, name, created_at, updated_at, parent_id) VALUES (6, '徐汇区', '2020-03-28 15:56:39.664924', '2020-03-28 15:56:39.664924', 2);

使用 UNION ALL 进行数据查询

with recursive sub_shanghai as (select id, name, parent_idfrom document_directorieswhere id=2union allselect dd.id, dd.name, dd.parent_idfrom document_directories ddjoin sub_shanghai on dd.parent_id=sub_shanghai.id)select * from sub_shanghai;

结果如下

 

使用 UNION 进行查询

with recursive sub_shanghai as (select id, name, parent_idfrom document_directorieswhere id=2unionselect dd.id, dd.name, dd.parent_idfrom document_directories ddjoin sub_shanghai on dd.parent_id=sub_shanghai.id)select * from sub_shanghai;

得到结果如下

 

我们修改下原始数据,再看下去重逻辑的区别

update document_directories set parent_id = 2 where id=2;

当我们使用 UNION 进行递归查询时,结果并没有发生变化。但是当我们使用 UNION ALL 进行查询时,会一直执行。这是因为 UNION ALL 不会将数据进行去重,而每次递归查询的时候,总归能查询到 {"id": 5, name:"上海", "parent_id": 2} 这条数据,所以递归就没有终止条件。

从而也验证了,UNION 不但会将本次递归查询的数据进行内部去重,也会和之前的递归结果进行去重。

http://www.ds6.com.cn/news/36847.html

相关文章:

  • 企业名称怎么取名seo关键词推广价格
  • 有没有做家居服设计师看的网站谷歌商店下载官方
  • 高端网站开发 金蝶哈尔滨网络优化推广公司
  • 个人网站转为企业网站百度seo关键词点击软件
  • 湖南汽车软件网站建设网站流量查询网站统计查询
  • wordpress删掉h1seo排名赚app
  • 通用精品课程网站建设的需求分析互联网营销师
  • 指纹定制网站如何建网站详细步骤
  • 推广网站建设语句对网站进行seo优化
  • 网站域名的注册时间人民网疫情最新消息
  • 怎么做简单网站百度快照
  • 重庆网站建设及推广公司站长之家域名查询官网
  • ps网站首页效果图实例如何制作网站链接
  • 创建网站花费推广什么软件可以长期赚钱
  • 下载织梦做网站软件b站免费版入口
  • 诸城 网站 建设seo是哪个英文的简写
  • 做宣传网站的公司怎么写软文推广
  • 不用关网站备案淘宝指数查询官网手机版
  • 网站做邮箱网站建站公司
  • 兰考县红庙关东村做网站的篮网最新消息
  • 东莞市建设质量监督网站友情链接平台赚钱吗
  • 付费做网站关键词优化是怎么做的呀站长查询工具
  • 天津河北做网站的公司怎么优化整站
  • 博达高校网站群建设教程seo网站外包公司
  • 湖南旅游网站开发谷歌浏览器安卓版下载
  • 旅游网官方网站神马seo教程
  • 邮箱qq登录入口最新seo课程
  • 衣服网站建设策划书河南网站网络营销推广
  • 和平东路网站建设网络营销是做什么的工作
  • 虎门镇网站仿做搜索引擎优化涉及的内容