天天看點

【MySQL】遞歸查詢

MySQL8.0版本以上支援遞歸查詢 <code>CTE</code>

形成CTE結構的基本結果集的初始查詢(initial_query),初始查詢部分被稱為錨成員。

遞歸查詢部分是引用CTE名稱的查詢,是以稱為遞歸成員。遞歸成員由一個<code>UNION</code>、<code>UNION ALL</code>或者<code>UNION DISTINCT</code>運算符與錨成員相連。

終止條件是當遞歸成員沒有傳回任何行時,確定遞歸停止。

首先,将成員分為兩個:錨點和遞歸成員。

接下來,執行錨成員形成基本結果集(<code>R0</code>),并使用該基本結果集進行下一次疊代。

然後,将<code>Ri</code>結果集作為輸入執行遞歸成員,并将<code>Ri+1</code>作為輸出。

之後,重複第三步,直到遞歸成員傳回一個空結果集,換句話說,滿足終止條件。

最後,使用<code>UNION ALL</code>運算符将結果集從<code>R0</code>到<code>Rn</code>組合。

遞歸CTE的查詢語句中需要包含一個終止遞歸查詢的條件。當由于某種原因在遞歸CTE的查詢語句中未設定終止條件時,MySQL會根據相應的配置資訊,自動終止查詢并抛出相應的錯誤資訊。在MySQL中預設提供了如下兩個配置項來終止遞歸CTE。

cte_max_recursion_depth:如果在定義遞歸CTE時沒有設定遞歸終止條件,當達到cte_max_recursion_depth參數設定的執行次數後,MySQL會報錯。

max_execution_time:表示SQL語句執行的最長毫秒時間,當SQL語句的執行時間超過此參數設定的值時,MySQL報錯。

檢視cte_max_recursion_depth參數的預設值,并設定。

檢視MySQL中max_execution_time參數的預設值,并設定。

遞歸查詢時,如果是由上往下查詢時,建議通過類似層級碼或者樹型碼字段,通過關鍵字 <code>LIKE</code> 查詢。

參考:

https://www.yiibai.com/mysql/recursive-cte.html

《MySQL技術大全》

好學若饑,謙卑若愚

繼續閱讀