• with 关键字实现递归查询


    通常用来实现树形结构

    首先来看一下表数据

     以下代码是递归查询北京市的树结构

    WITH org AS (
     SELECT Code, name, parentCode, 1 AS level
     FROM TestCity 
    WHERE code = '01'
     UNION ALL
     SELECT t1.Code, t1.name, t1.parentCode, t2.level + 1 AS level
     FROM TestCity t1 INNER JOIN org t2
       ON t1.parentCode = t2.Code
    )
    SELECT
    *
    FROM org
    

      

    注意:如果要在with表达式中计算,需要保证两边的type一致,如

    WITH org AS (
     SELECT Code, name, parentCode, 1 AS level, tname = CAST('' as nvarchar(20))
     FROM TestCity 
    WHERE code = '01'
     UNION ALL
     SELECT t1.Code, t1.name, t1.parentCode, t2.level + 1 AS level, tanme = CAST(N'|--' + t2.tname as nvarchar(20))
     FROM TestCity t1 INNER JOIN org t2
       ON t1.parentCode = t2.Code
    )
    SELECT code ,parentCode, tname + name  as name 
    FROM org
    

      

    再比较以下两段从StackOverFolw中摘来的代码

    --报错 Types don't match between the anchor and the recursive part in column "nm" of recursive query "cte".
    WITH cte AS (
      SELECT 
        1 as rn, 
        'name1' as nm
      UNION ALL
      SELECT 
        rn + 1,
        nm = 'name' + CAST((rn + 1) as varchar(255))
      FROM cte a WHERE rn < 10)
    SELECT * 
    FROM cte
    
    --正解
    with cte as
    (
    select  1 as rn, 
            CAST('name1' AS VARCHAR(255)) as nm
    union all
    select  rn+1,
            nm = CAST('name' + CAST((rn+1) as varchar(255)) AS VARCHAR(255))
    from cte a where rn<10)
    select * from cte
    

      

  • 相关阅读:
    内置函数的补充
    python3 集合中的常用方法
    Salesforce: ISCHANGED在workflow中的使用
    Salesforce: setTreatTargetObjectAsRecipient的使用
    python实现用户登录次数太多账号"锁定"
    docker命令
    scrapy框架的安装
    分布式爬虫
    scrapy框架mongodb正规存储
    redis
  • 原文地址:https://www.cnblogs.com/guangmangchen/p/6688883.html
Copyright © 2020-2023  润新知