PostgreSQL:WITH
在 PostgreSQL 裡,提供了一種方法寫一個大的查詢中使用的輔助報表與查詢。它有助於打破複雜和大型查詢簡單易讀的形式,通常被稱為 CTE(Common Table Expressions:通用表表示式),可以被看作是定義臨時表的存在只是一個查詢。
WITH 查詢由 CTE 查詢時特別有用的子查詢執行多次。它是代替臨時表中同樣有幫助。它計算聚合一次,讓我們來引用它由它的名字(可能是多次)查詢。
WITH 子句必須定義,才能在查詢中使用。
語法
在with查詢的基本語法如下:
WITH name_for_summary_data AS ( SELECT Statement) SELECT columns FROM name_for_summary_data WHERE conditions <=> ( SELECT column FROM name_for_summary_data) [ORDER BY columns]
name_for_summary_data:是指定的名稱WITH子句。name_for_summary_data 現有的表名可以是相同的將被優先考慮。
遞迴 WITH
WITH 查詢的一個重要屬性時 RECURSIVE,使用 RECURSIVE 屬性可以引用自己的輸出,從而實現遞迴,一般用於層次結構或樹狀結構的應用場景。
例項
考慮表 COMPANY 有如下記錄:
select * from COMPANY; id | name | age | address | salary ----+-------+-----+-----------+-------- 1 | Paul | 32 | California| 20000 2 | Allen | 25 | Texas | 15000 3 | Teddy | 23 | Norway | 20000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | South-Hall| 45000 7 | James | 24 | Houston | 10000 (7 rows)
從上面的表中執行普通 WITH 子句查詢,記錄如下:
With CTE AS (SELECT ID, NAME, AGE, ADDRESS, SALARY FROM COMPANY ) Select * From CTE; id | name | age | address | salary ----+-------+-----+-----------+-------- 1 | Paul | 32 | California| 20000 2 | Allen | 25 | Texas | 15000 3 | Teddy | 23 | Norway | 20000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | South-Hall| 45000 7 | James | 24 | Houston | 10000 (7 rows)
使用遞迴關鍵字 WITH 子句,找到小於 20000 的薪金總和,如下:
WITH RECURSIVE t(n) AS ( VALUES (0) UNION ALL SELECT SALARY FROM COMPANY WHERE SALARY < 20000 ) SELECT sum(n) FROM t; sum ------- 25000 (1 row)
優點
-
CTE 可以簡化 SQL 程式碼,減少 SQL 巢狀層數,提高 SQL 程式碼的可讀性。
-
CTE 的輔助語句只需要計算一次,在主查詢中可以多次使用。
-
當不需要共享查詢結果時,相比檢視更輕量。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31490526/viewspace-2738525/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PostgreSQL DBA(45) - Hypothetical Indexes in PostgreSQLSQLIndex
- PostgreSQLSQL
- PostgreSQL DBA(133) - Extension(postgresql_anonymizer)SQL
- PostgreSQL DBA(181) - Using PostgreSQL as a Data WarehouseSQL
- PostgreSQL:Redhat 8.5 + PostgreSQL 14.5 安裝SQLRedhat
- PostgreSQL-PostgreSQL中的public(九)SQL
- postgresql關於postgresql.auto.conf和postgresql.conf的區別SQL
- 【PostgreSQL 】PostgreSQL 15對distinct的優化SQL優化
- PostgreSQL:COPYSQL
- Hacking PostgreSQLSQL
- PostgreSQL核心SQL
- PostgreSQL:表SQL
- PostgreSQL:INDEXSQLIndex
- PostgreSQL:鎖SQL
- PostgreSQL:RULESQL
- PostgreSQL:EXPLAINSQLAI
- PostgreSQL DBA(142) - PG 12(Monitoring PostgreSQL VACUUM processes)SQL
- PostgreSQL TPROC-C基準測試:PostgreSQL 12與PostgreSQL 13效能對比SQL
- postgreSQL學習(一):在Linux下安裝postgreSQLSQLLinux
- PostgreSQL DBA(143) - pgAdmin(Monitoring PostgreSQL VACUUM processes#2)SQL
- PostgreSQL 速查、備忘手冊 | PostgreSQL Quick Find and TutorialSQLUI
- POSTGRESQL postgresql 升級的需求來自哪裡SQL
- 【pgupgrade】Postgresql10升級到Postgresql13SQL
- Postgresql 的CheckpointSQL
- PostgreSQL快取SQL快取
- 初識PostgreSqlSQL
- PostgreSQL 序列(Sequence)SQL
- Using hints for PostgresqlSQL
- PostgreSQL 入門SQL
- PostgreSQL BenchmarkSQL使用SQL
- Introducing PMDK into PostgreSQLSQL
- PostgreSQL基礎SQL
- Tool-PostgresqlSQL
- postgresql 筆記SQL筆記
- PostgreSQL 架構SQL架構
- postgreSQL install pgvectorSQL
- PostgreSQL sequence (一)SQL
- PostgreSQL外掛SQL