PostgreSQL | CTE | 使用with子句的通用表达式

CTE(Common Table Expressions)

简单讲,CTE就是日常SQL中出现的with语句,其原理就是通过提前将数据查询出来后作为临时结果集使用,可以与SELECT \ INSERT \ UPDATE \ DELETE的SQL连用。

优点

  1. 可读性强
    • CTE 允许你将复杂的查询拆分成易于理解和管理的块。这使得查询更易于阅读、理解和维护。
  2. 重用性
    • CTE 可以在一个查询中多次引用,这使得可以将复杂的逻辑组件分解成可重复使用的部分。
  3. 递归查询
    • CTE 允许你执行递归查询,这是一种对于层次化数据结构(如组织结构或树形结构)非常有用的功能。
  4. 优化器支持
    • PostgreSQL 的查询优化器可以对 CTE 进行优化,以确保最佳执行计划。

缺点

  1. 性能开销
    • 在某些情况下,使用 CTE 可能会导致性能开销。在处理大量数据时,可能会出现性能下降。
  2. 可读性降低
    • 尽管 CTE 可以提高可读性,但如果不正确使用,可能会导致查询变得更难理解。特别是在多个 CTE 之间建立复杂的关系时。
  3. 内存消耗
    • CTE 通常需要在内存中存储临时结果集,因此对于大型数据集可能会导致内存消耗较高。
  4. 不能在索引中使用
    • 不能在 CTE 中创建索引,这可能会导致在某些情况下查询性能下降。
  5. 递归查询潜在的性能问题
    • 对于大型或者深度很深的递归查询,可能会导致性能问题。

示例

  1. INSERT - 插入

    WITH r AS (SELECT code, nameFROM t1
    )
    INSERT INTO t2(code,name)
    SELECT code,name
    FROM r;
    
  2. UPDATE - 更新

    WITH r AS (SELECT code, nameFROM t1
    )
    UPDATE t2 
    SET t2.name = t1.name
    FROM t1
    WHERE t1.code = t2.code;
    
  3. SELECT - 查询

    WITH r AS (SELECT code, nameFROM t1
    )
    SELECT t2.*
    FROM t2
    WHERE EXISTS (SELECT 1 FROM t1 where t1.code = t2.code);
    
  4. DELETE - 删除

    WITH r AS (SELECT code, nameFROM t1
    )
    DELETE FROM t2
    WHERE code IN (SELECT code FROM t1);
    
  5. RECURSIVE - 递归查询

    WITH RECURSIVE r AS (SELECT id, name, parent_id, 1 as levelFROM organizationWHERE parent_id IS NULLUNION ALLSELECT o.id, o.name, o.parent_id, oh.level + 1FROM organization oJOIN r oh ON o.parent_id = oh.id
    )
    SELECT id, name, level
    FROM r;

WITH在一定程度能 解决数据库查询上的一些问题,但并不是每次适合,需要对照上述的优缺点,自行判断是否需要使用。



🎉如果对你有所帮助,可以点赞、关注、收藏起来,不然下次就找不到了🎉


【点赞】⭐️⭐️⭐️⭐️⭐️
【关注】⭐️⭐️⭐️⭐️⭐️
【收藏】⭐️⭐️⭐️⭐️⭐️

Thanks for watching.
Kenny

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/107203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

老卫带你学---leetcode刷题(122. 买卖股票的最佳时机 II)

122. 买卖股票的最佳时机 II 问题 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。 返回…

【vim 学习系列文章 8 -- vim中 has 函数和 let g:介绍】

文章目录 1.1 vim has 函数1.2 vim let g: 介绍 1.1 vim has 函数 在 Vim 中,has 是一个内置的函数,用于检查 Vim 是否支持某个特定的特性或者是否包含某个特定的扩展。 此函数的基本语法是: if has(feature)其中,‘feature’ …

数据结构与算法--其他算法

数据结构与算法--其他算法 1 汉诺塔问题 2 字符串的全部子序列 3 字符串的全排列 4 纸牌问题 5 逆序栈问题 6 数字和字符串转换问题 7 背包问题 8 N皇后问题 暴力递归就是尝试 1,把问题转化为规模缩小了的同类问题的子问题 2,有明确的不需要继续…

设计模式之是简单工厂模式

分类 设计模式一般分为三大类:创建型模式、结构型模式、行为型模式。 创建型模式:用于创建对象,共五种,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。结构型模式:用于处理类或对…

超火爆的6 个必学持续集成工具,测试人的福音

开发人员喜欢把写的代码当成自己的孩子,他们会被当成艺术品一样呵护。作为家长,总是会认为自己的孩子是最好的,也会尽全力给自己的孩子最好的,就算有时候会超出自己的能力范围。 最终,孩子会走出去,和其他…

2023自动驾驶 车道线检测数据集

目录 2023自动驾驶 车道线检测关键数据集 下载链接 labelme标注制作数据: 可视化tusimple数据集 车道线分割项目记录-tusimple数据集处理 2023自动驾驶 车道线检测关键数据集 下载链接<

android studio检测不到真机

我的情况是&#xff1a; 以前能检测到&#xff0c;有一天我使用无线调试&#xff0c;发现调试有问题&#xff0c;想改为USB调试&#xff0c;但是半天没反应&#xff0c;我就点了手机上的撤销USB调试授权&#xff0c;然后就G了。 解决办法&#xff1a; 我这个情况比较简单&…

Redission 使用Jackson处理LocalDateTime的一些坑

(redis) 文章目录 Redission 使用Jackson处理LocalDateTime的一些坑不支持jsr310的问题&#xff08;浅坑&#xff09;准备问题解决 读取 LocalDateTime类型的值的问题&#xff08;深坑&#xff09;准备问题解决 总结 Redission 使用Jackson处理LocalDateTime的一些坑 当我们想…

TypeScript 类型兼容性

TypeScript 类型兼容性 在前端开发中&#xff0c;使用 TypeScript 可以提供更强大的类型检查和类型安全。然而&#xff0c;了解 TypeScript 中的类型兼容性是至关重要的&#xff0c;因为它涉及如何处理不同类型之间的关系&#xff0c;以及在这些类型之间进行无缝的交互。本文将…

Leetcode刷题笔记--Hot61-70

1--课程表&#xff08;207&#xff09; 主要思路&#xff1a; 用 in 记录每一门课程剩余的先修课程个数&#xff0c;当剩余先修课程个数为0时&#xff0c;将该课程加入到队列q中。 每修队列q中的课程&#xff0c;以该课程作为先修课程的所有课程&#xff0c;其剩余先修课程个数…

Kubernetes实战(三)-k8s节点设置cpu高于多少就不调度

1 k8s节点设置的概念和原理 k8s是Google开源的容器集群管理系统&#xff0c;用于自动化部署、扩展和管理容器化应用程序。在k8s中&#xff0c;Node是指容器运行的物理或虚拟机器。Node可以是一个物理机或一个虚拟机器&#xff0c;k8s通过其调度器将Pod调度到每个Node上。对于一…

人机环境系统中的“人”、“机”、“环境”

人机环境系统中的“人”、“机”、“环境”是指在一个系统中&#xff0c;人、机和环境三者的相互作用和影响&#xff0c;三者之间的相互作用和影响非常复杂&#xff0c;需要进行有效的协调和管理才能实现系统的高效运转或预期的目标。因此&#xff0c;人机环境系统的设计和优化…

vue elementui的select组件实现滑到底部分页请求后端接口

vue elementui的select组件实现滑到底部分页请求后端接口 1.实现效果2.实现原理 1.实现效果 老规矩&#xff0c;直接上最后的实现效果 2.实现原理 直接上代码 <el-form-item class"diagmosisItem" label"诊断" v-scroll"handleScroll">…

✔ ★【备战实习(面经+项目+算法)】 10.15学习时间表

✔ ★【备战实习&#xff08;面经项目算法&#xff09;】 坚持完成每天必做如何找到好工作1. 科学的学习方法&#xff08;专注&#xff01;效率&#xff01;记忆&#xff01;心流&#xff01;&#xff09;2. 每天认真完成必做项&#xff0c;踏实学习技术 认真完成每天必做&…

【微信小程序开发】基础语法篇

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于小程序的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.视图层 1.数据绑定 wxml js 2 .列…

Python学习六

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

前端工程化知识系列(4)

目录 31. 你是否了解前端性能优化的指标&#xff0c;例如首次内容绘制&#xff08;FCP&#xff09;、最大内容绘制&#xff08;LCP&#xff09;和累计布局位移&#xff08;CLS&#xff09;&#xff1f;如何针对这些指标进行优化&#xff1f;32. 你有没有经验使用服务端渲染&…

Yum安装JDK11

一、安装命令 &#xff1a; yum install java-11-openjdk二、执行以下命令来查看 JDK 11 的安装信息&#xff1a; yum list installed | grep java-11-openjdk三、找到 JDK 11 的软件包名称&#xff08;使用以下命令来查询软件包的安装位置&#xff09;&#xff1a; rpm -ql…

AnolisOS升级SSH,不升级SSL

由于ssh有漏洞需要升级&#xff0c;但是为了最小化升级不影响ssl&#xff0c;因为ssl里面带了加密库&#xff0c;系统中很多核心服务的加密都是用ssl进行加密的&#xff08;像网络服务&#xff0c;系统用户登录等&#xff09;&#xff0c;如果ssl升级出现不兼容&#xff0c;就可…

Java实现B树

1.介绍 B树是一种自平衡的搜索树数据结构&#xff0c;常用于数据库和文件系统中的索引结构。它具有以下好处和功能&#xff1a; 高效的查找操作&#xff1a;B树的特点是每个节点可以存储多个关键字&#xff0c;并且保持有序。通过在节点上进行二分查找&#xff0c;可以快速定位…