SQL Server 中的遞歸查詢
名為「matches」的表格儲存產品配對,其中一個產品與另一個產品相符。目標是建立一個「群組」表,用於標識由所有相互匹配的產品組成的產品組。群組 ID 應儲存每個群組中的最小產品 ID。
遞歸CTE 解
為了實現此目的,我們可以採用遞歸通用表表達式(CTE):如下:
WITH CTE AS ( SELECT DISTINCT M1.Product_ID AS Group_ID, M1.Product_ID FROM matches AS M1 LEFT JOIN matches AS M2 ON M1.Product_Id = M2.matching_Product_Id WHERE M2.matching_Product_Id IS NULL UNION ALL SELECT C.Group_ID, M.matching_Product_Id FROM CTE AS C JOIN matches AS M ON C.Product_ID = M.Product_ID ) SELECT * FROM CTE ORDER BY Group_ID;
CTE 遞歸地尋找彼此直接或間接相關的所有產品。它首先識別沒有匹配產品的產品(Group_ID 是它們自己的 Product_ID)。然後,它會檢索每個組的所有匹配產品,並將它們添加到 CTE。 UNION ALL 子句將初始查詢的結果與後續迭代的結果組合起來,確保找到所有符合的產品。
ORDER BY Group_ID 子句按群組 ID 升序排列結果,提供了一種簡單的方法來識別產品群組及其成員的方法。
自訂遞歸深度
使用OPTION(MAXRECURSION n) 子句,我們可以控制最大遞歸深度,這有助於防止在產品關係複雜的情況下過度遞歸。
示範
詳細示範請參考SQL Fiddle範例:
https://www.sqlfiddle.com/#!17/d4e0f/20332
以上是遞歸 CTE 如何根據配對對識別 SQL Server 中的產品群組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!