• 学习递归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;

    查询结果图:


     

  • 相关阅读:
    常用的居中方法
    CSS实现盒子高度撑开且以最高的为高
    利用vertical-align实现行内元素对齐
    CSS实现模糊效果
    【LeetCode 37】解数独
    【LeetCode 36】有效的数独
    【LeetCode 35】搜索插入位置
    【LeetCode 34】在排序数组中查找元素的第一个和最后一个位置
    【LeetCode 33】搜索旋转排序数组
    【LeetCode 32】最长有效括号
  • 原文地址:https://www.cnblogs.com/wghao/p/1118169.html
Copyright © 2020-2023  润新知