10個SQL技巧之二:使用遞迴SQL生成資料
公用表表示式(也稱為:CTE,如在Oracle中也稱為子查詢因子,)是在SQL中宣告變數的唯一方法(除了只有PostgreSQL和Sybase SQL Anywhere支援得WINDOW模糊子句)。
這是一個強大的概念。非常強大。請考慮以下宣告:
-- Table variables WITH t1(v1, v2) AS (SELECT 1, 2), t2(w1, w2) AS ( SELECT v1 * 2, v2 * 2 FROM t1 ) SELECT * FROM t1, t2 |
它產生了:
v1 v2 w1 w2 ----------------- 1 2 2 4 |
使用簡單的WITH子句,您可以指定表變數列表(記住:一切都是表),它們甚至可能相互依賴。
這很容易理解。這使得CTE(公用表格表示式)已經非常有用,但真正令人敬畏的是它們被允許遞迴!考慮以下PostgreSQL示例:
WITH RECURSIVE t(v) AS ( SELECT 1 -- Seed Row UNION ALL SELECT v + 1 -- Recursion FROM t ) SELECT v FROM t LIMIT 5 |
它產生了:
v - 1 2 3 4 5 |
它是如何工作的?一旦你看到很多關鍵詞,它就相對容易了。您定義一個公共表表示式,它只有兩個UNION ALL子查詢。
第一次UNION ALL個子查詢是我通常所說的“種子行”。它“種子”(初始化)遞迴。它可以產生一行或幾行,之後我們會遞迴。記住:一切都是一個表,所以我們的遞迴將發生在整個表上,而不是單個行/值。
第二次UNION ALL個子查詢是遞迴發生的地方。仔細觀察,你會發現它是從中選擇的t。即允許第二個子查詢從我們即將宣佈的CTE中進行選擇。遞迴。因此它也可以訪問v列,它已經被使用它的CTE宣告過的。
在我們的示例中,我們使用行播種遞迴(1),然後透過新增來遞迴v + 1。然後透過設定a LIMIT 5(謹防可能無限的遞迴 - 就像Java 8 Streams一樣)在使用現場停止遞迴。
附註:圖靈完整性
遞迴CTE使SQL:1999圖靈完成,這意味著任何程式都可以用SQL編寫!(如果你夠瘋狂的話)
一個經常出現在部落格上的令人印象深刻的例子:Mandelbrot Set,例如http://explainextended.com/2013/12/31/happy-new-year-5/上顯示:
WITH RECURSIVE q(r, i, rx, ix, g) AS ( SELECT r::DOUBLE PRECISION * 0.02, i::DOUBLE PRECISION * 0.02, .0::DOUBLE PRECISION , .0::DOUBLE PRECISION, 0 FROM generate_series(-60, 20) r, generate_series(-50, 50) i UNION ALL SELECT r, i, CASE WHEN abs(rx * rx + ix * ix) <= 2 THEN rx * rx - ix * ix END + r, CASE WHEN abs(rx * rx + ix * ix) <= 2 THEN 2 * rx * ix END + i, g + 1 FROM q WHERE rx IS NOT NULL AND g < 99 ) SELECT array_to_string(array_agg(s ORDER BY r), '') FROM ( SELECT i, r, substring(' .:-=+*#%@', max(g) / 10 + 1, 1) s FROM q GROUP BY i, r ) q GROUP BY i ORDER BY i |
在PostgreSQL上執行上面的內容,你會得到類似的東西:
..:-....... = = * = :: - @@@@@ ::::。@ .. * - 。=。 ... = ... = ... :: +%@:@@@@@@@@@@@@@ + *#= =:+ - 。..- 。:。:= :: * .... @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ..:。 ... * @@@@ = @:@@@@@@@@@@@@@@@@@@@@@@@@@@ = = ....:。...: :。 :: @@@@@: - @@@@@@@@@@@@@@@@@@@@@@@@@@@@:@ ..-:@ = * ::: 。 .- @@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ = @@@@ = .. : ... @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 。 ....: - * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@: : ..... @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .. ..... @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - : ...... .--:+。@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@ ... == @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@ - .. .. + @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@ - #。 ... = + @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@ .. - 。= - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@ ..: 。*%:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@:@ - 。..:... ..- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@ .............. ....- @@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@ = - = - .....-:。.......... :: @@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .. .. =:-.... = @ + .. = .... ..... @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@ :. :+ @@ :: @ == @ - *:%:+ .......:@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@。 :: @@@ - @@@@@@@@@ - := .....:@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@: :@@@@@@@@@@@@@@@ =: .....%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@ :@@@@@@@@@@@@@@@@@ -...:@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@: - :@@@@@@ @@@@@@@@@@@@@ - ..%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@。 %@@@@@@@@@@@@@@@@@@@ -..- @@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@。 @@@@@@@@@@@@@@@@@@@@@ :: + @@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@@@:@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .. @@@@@@@@@@@@@@@@@@@ @@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@。 |
令人印象深刻,是吧?
相關文章
- sql server遞迴SQLServer遞迴
- SQL 遞迴思想SQL遞迴
- SQL中的遞迴用法SQL遞迴
- SQL Server2005使用CTE實現遞迴QCSQLServer遞迴
- SQL server資料庫with as子句與遞迴查詢的實現SQLServer資料庫遞迴
- kingbase SQL最佳化案例 ( union遞迴 改 cte遞迴 )SQL遞迴
- 10個SQL技巧之三:進行總計算SQL
- 10 個使用 SQL 的 AWS 服務SQL
- 關於Sql server資料型別HierarchyID 資料型別用法和遞迴顯示完整路徑SQLServer資料型別遞迴
- PG資料庫SQL最佳化小技巧資料庫SQL
- 幾個SQL查詢小技巧SQL
- SQL Server 2014如何使用遊標迴圈向遠端資料庫插入資料SQLServer資料庫
- Blazor使用sql server 資料庫BlazorSQLServer資料庫
- SQL Server 批量生成資料庫內多個表的表結構SQLServer資料庫
- 遊標和遞迴sql 的一些程式碼遞迴SQL
- 10個SQL技巧之一:一切都是表SQL
- hirolau/SQL:金融領域的SQL技巧SQL
- 私藏!資深資料專家SQL效率最佳化技巧 ⛵SQL
- jsqlparser使用記錄---生成sql語句JSSQL
- 【SQL】18 SQL NULL 函式、SQL 通用資料型別、SQL 用於各種資料庫的資料型別SQLNull函式資料型別資料庫
- PL/SQL 迴圈SQL
- 【SQL】Oracle資料庫sql最佳化小技巧索引不管用怎麼辦01SQLOracle資料庫索引
- SQL資料庫SQL資料庫
- 30個MySQL千萬級大資料SQL查詢最佳化技巧詳解MySql大資料
- 資料結構-遞迴資料結構遞迴
- leetcode:遞迴:括號生成LeetCode遞迴
- 遞迴生成格雷碼遞迴
- 使用Oracle SQL Developer匯入Excel資料OracleSQLDeveloperExcel
- 3.1.1.1 使用 SQL*Plus 啟動資料庫SQL資料庫
- 使用binlog2sql恢復資料SQL
- 使用mysqldump以SQL格式來dump資料MySql
- 13 使用SQL Apply 升級資料庫SQLAPP資料庫
- 在登入資料庫的使用!sql資料庫SQL
- 如何使用SQL查詢檢視,Postico使用技巧分享~SQL
- 資料庫最佳化技巧 - SQL語句最佳化資料庫SQL
- SQL Server無法刪除資料庫 "xxx",因為該資料庫當前正在使用(如何刪除一個Sql Server資料庫)SQLServer資料庫
- 【SQL】10 SQL UPDATE 語句SQL
- 資料庫常用的sql語句大全--sql資料庫SQL