zoukankan      html  css  js  c++  java
  • 使用公用表表达式的递归查询

      微软从SQL2005起引入了CTE(Common Table Expression)以强化T-SQL

      公用表表达式 (CTE) 具有一个重要的长处,那就是可以引用其自身。从而创建递归 CTE。递归 CTE 是一个反复运行初始 CTE 以返回数据子集直到获取完整结果集的公用表表达式。

      当某个查询引用递归 CTE 时。它即被称为递归查询。递归查询通经常使用于返回分层数据,比如:显示某个组织图中的雇员或物料清单方案(当中父级产品有一个或多个组件,而那些组件可能还有子组件,或者是其它父级产品的组件)中的数据。

      递归 CTE 能够极大地简化在 SELECTINSERTUPDATEDELETE  CREATE VIEW 语句中执行递归查询所需的代码。在 SQL Server 的早期版本号中。递归查询通常须要使用暂时表、游标和逻辑来控制递归步骤流。有关公用表表达式的具体信息。请參阅使用公用表表达式

    伪代码和语义

    ————————————————————————————

    递归 CTE 结构必须至少包括一个定位点成员和一个递归成员。下面伪代码显示了包括一个定位点成员和一个递归成员的简单递归 CTE 的组件。

    WITH cte_name ( column_name [,...n] )

    AS

    (

    CTE_query_definition –- Anchor member is defined.

    UNION ALL

    CTE_query_definition –- Recursive member is defined referencing cte_name.

    )

    -- Statement using the CTE

    SELECT FROM cte_name

    递归运行的语义例如以下:

    1. 将 CTE 表达式拆分为定位点成员和递归成员。
    2. 执行定位点成员。创建第一个调用或基准结果集 (T0)。
    3. 执行递归成员,将 Ti 作为输入,将 Ti+1 作为输出。

    4. 反复步骤 3,直到返回空集。
    5. 返回结果集。这是对 T0 到 Tn 执行 UNION ALL 的结果。 

    演示样例

    ————————————————————————————

    原表:

     

     如今有一个需求,要查询出某个省以下的全部市和区(查询结果包括省)。假设仅仅使用SQL语句来实现,须要使用到游标、暂时表等技术。

    但在SQL Server2005中还能够使用CTE来实现。

    WITH district

    AS

    (

        --获得第一个结果集,并更新终于结果集

        SELECT * FROM t_tree WHERE id = 0

        UNION ALL

        --以下的select语句首先会依据从上一个查询结果集中获得的id值来查询parent_id

        --字段的值,然后district就会变当前的查询结果集。并继续运行以下的select 语句

        --假设结果集不为null。则与终于的查询结果合并,同一时候用合并的结果更新终于的查

        --询结果;否则停止运行。

    最后district的结果集就是终于结果集。

        SELECT a.* FROM t_tree aINNER JOIN district bONa.parent_id = b.id

    )

    SELECT * FROM district

    查询结果:


    有关使用公用表表达式的具体信息,请參阅使用公用表表达式的递归查询

  • 相关阅读:
    数组(array)
    亲戚(relative)
    [ZJOI2016]小星星
    P4782 【模板】2-SAT 问题
    CF1065F Up and Down the Tree
    CF1065C Make It Equal
    CF1060F Shrinking Tree
    CF1060E Sergey and Subway(点分治)
    CF1060D Social Circles
    CF1060C Maximum Subrectangle
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5112810.html
Copyright © 2011-2022 走看看