zoukankan      html  css  js  c++  java
  • 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
    

      

  • 相关阅读:
    不要放弃你的梦想
    ResultSet获得总行数的方法
    MS SQL Server数据库事务锁机制分析
    VS2005学习02Visual Studio® 2005 Team System
    获取打印机
    Download Accelerator PlusDAP
    设置打印机
    sqlserver2005里查询当前锁的状态。
    Excel的单位的转换
    PGP的密匙和口令的安全性问题
  • 原文地址:https://www.cnblogs.com/guangmangchen/p/6688883.html
Copyright © 2011-2022 走看看