zoukankan      html  css  js  c++  java
  • 学习递归CTE

    什么叫CTE:
    指定临时命名的结果集,这些结果集称为公用表表达式 (CTE)。

    语法:
    [ WITH <common_table_expression> [ ,...n ] ]

    <common_table_expression>::=
            expression_name [ ( column_name [ ,...n ] ) ]
        AS
            ( CTE_query_definition )

    expression_name :
         公用表表达式的有效标识符。
    column_name :
         在公用表表达式中指定列名
    CTE_query_definition :
        指定一个其结果集填充公用表表达式的 SELECT 语句

    这里主要是学习递归CTE。

    这里使用帮助文档的SQL例子。
    以下示例使用多个定位点和递归成员来返回指定的人的所有祖先。
    家谱结构如图:

    -- 创建家谱表并插入数据:

    IF OBJECT_ID('Person','U') IS NOT NULL DROP TABLE Person;
    GO
    CREATE TABLE Person(ID int, Name varchar(30), Mother int, Father int);
    GO
    INSERT Person VALUES(1, 'Sue', NULL, NULL);
    INSERT Person VALUES(2, 'Ed', NULL, NULL);
    INSERT Person VALUES(3, 'Emma', 1, 2);
    INSERT Person VALUES(4, 'Jack', 1, 2);
    INSERT Person VALUES(5, 'Jane', NULL, NULL);
    INSERT Person VALUES(6, 'Bonnie', 5, 4);
    INSERT Person VALUES(7, 'Bill', 5, 4);
    GO

    --建立递归CTE,找出邦妮(Bonnie)的所以祖先:
    WITH Generation (ID) AS
    (

    -- 第一个定位点:找出Bonnie的母亲
        SELECT Mother
        FROM Person
        WHERE Name = 'Bonnie'
    UNION

    -- 第二个定位点:找出Bonnie的父亲
        SELECT Father
        FROM Person
        WHERE Name = 'Bonnie'
    UNION ALL
    -- 第一个递归找出父辈的祖先(男)
        SELECT Person.Father
        FROM Generation, Person
        WHERE Generation.ID=Person.ID
    UNION ALL

    -- 第二个递归找出父辈的祖先(女)
        SELECT Person.Mother
        FROM Generation, Person
        WHERE Generation.ID=Person.ID
    )
    SELECT Person.ID, Person.Name, Person.Mother, Person.Father
    FROM Generation, Person
    WHERE Generation.ID = Person.ID;
    GO

    在Word中画图说明,如图:



    结果如图Genealogy2:

     


    找出与Sue有血缘关系的子孙:
    Sue--->Emma、Jack--->Bill、Bonnie
    如图:



    --找出与Sue有血缘关系的子孙

    WITH Generation1(id) as
    (
     SELECT ID FROM Person WHERE Name='Sue'
     UNION ALL
     SELECT A.ID FROM Person A
      INNER JOIN Generation1 B ON A.Mother=B.id
     UNION ALL
     SELECT A.ID FROM Person A
      INNER JOIN Generation1 B ON A.Father=B.id
    )
    SELECT Person.ID, Person.Name, Person.Mother, Person.Father
    FROM Generation1, Person
    WHERE Generation1.ID = Person.ID;

    查询结果图:


     

  • 相关阅读:
    二阶段项目所遇问题 加载分页信息并且加入删除摁钮 限制权限可见
    用kryonet时kryo报buffer underflow错误
    《深入理解Java虚拟机》读书笔记七
    《深入理解Java虚拟机》读书笔记六
    《深入理解Java虚拟机》读书笔记五
    《深入理解Java虚拟机》读书笔记四
    《深入理解Java虚拟机》读书笔记三
    《深入理解Java虚拟机》读书笔记二
    《深入理解Java虚拟机》读书笔记一
    《实战Java高并发程序设计》读书笔记六
  • 原文地址:https://www.cnblogs.com/wghao/p/1118169.html
Copyright © 2011-2022 走看看