• PostgreSQL-WITH AS短语


    WITH提供了一种方式来书写在一个大型查询中使用的辅助语句。这些语句通常被称为公共表表达式或CTE,
    它们可以被看成是定义只在一个查询中存在的临时表。在WITH子句中的每一个辅助语句可以是一个SELECT、INSERT、UPDATE或DELETE,
    并且WITH子句本身也可以被附加到一个主语句,主语句也可以是SELECT、INSERT、UPDATE或DELETE。

    WITH
    regional_sales AS ( SELECT region, SUM(amount) AS total_sales FROM orders GROUP BY region ), top_regions AS ( SELECT region FROM regional_sales WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales) ) SELECT region, product, SUM(quantity) AS product_units, SUM(amount) AS product_sales FROM orders WHERE region IN (SELECT region FROM top_regions) GROUP BY region, product;

    with语句与全连接

    WITH RECURSIVE included_parts(sub_part, part, quantity) AS (
        SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product'
      UNION ALL
        SELECT p.sub_part, p.part, p.quantity
        FROM included_parts pr, parts p
        WHERE p.part = pr.sub_part
    )
    SELECT sub_part, SUM(quantity) as total_quantity
    FROM included_parts
    GROUP BY sub_part

     创建表、插入数据

    --DROP TABLE COMPANY;
    CREATE TABLE COMPANY(
       ID INT PRIMARY KEY     NOT NULL,
       NAME           TEXT    NOT NULL,
       AGE            INT     NOT NULL,
       ADDRESS        CHAR(50),
       SALARY         REAL
    );
    INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (1, 'Paul', 32, 'California', 20000.00 );
    
    INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (2, 'Allen', 25, 'Texas', 15000.00 );
    
    INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );
    
    INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );
    
    INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (5, 'David', 27, 'Texas', 85000.00 );
    
    INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (6, 'Kim', 22, 'South-Hall', 45000.00 );
    
    INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00 );

    接下来让我们使用 RECURSIVE 关键字和 WITH 子句编写一个查询,查找 SALARY(工资) 字段小于 20000 的数据并计算它们的和:

    WITH RECURSIVE t(n) AS (
       VALUES (0)
       UNION ALL
       SELECT SALARY FROM COMPANY WHERE SALARY < 20000
    )
    SELECT sum(n) FROM t;

     

    建立一张和 COMPANY 表相似的 COMPANY1 表,使用 DELETE 语句和 WITH 子句删除 COMPANY 表中 SALARY(工资) 字段大于等于 30000 的数据,并将删除的数据插入 COMPANY1 表,实现将 COMPANY 表数据转移到 COMPANY1 表中:

    CREATE TABLE COMPANY1(
       ID INT PRIMARY KEY     NOT NULL,
       NAME           TEXT    NOT NULL,
       AGE            INT     NOT NULL,
       ADDRESS        CHAR(50),
       SALARY         REAL
    );
    
    --删除 COMPANY 表中 SALARY(工资) 字段大于等于 30000 的数据,
    WITH moved_rows AS ( DELETE FROM COMPANY WHERE SALARY >= 30000 RETURNING * )

    --并将删除的数据插入 COMPANY1 表
    INSERT INTO COMPANY1 (SELECT * FROM moved_rows);

    本文参考:https://blog.csdn.net/freshman2020/article/details/110551342?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

    心有猛虎,细嗅蔷薇
  • 相关阅读:
    RabbitMQ 记录
    RabbitMQ 问题记录
    (转)非常完善的Log4net详细说明
    (转)【推荐】初级.NET程序员,你必须知道的EF知识和经验
    移动相关
    (转)2014年最新前端开发面试题(题目列表+答案 完整版)
    Unity IOC容器的简单应用(转)
    httpclient模拟post请求json封装表单数据
    《SpringMVC从入门到放肆》六、SpringMVC开发Controller的方法总结
    《SpringMVC从入门到放肆》五、SpringMVC配置式开发(处理器适配器)
  • 原文地址:https://www.cnblogs.com/1314520xh/p/14711451.html
Copyright © 2020-2023  润新知