zoukankan      html  css  js  c++  java
  • t-sql最短路径搜索

      1 SET STATISTICS IO ON; 
      2 SET STATISTICS TIME ON; 
      3 GO 
      4 IF OBJECT_ID(N'dbo.t1') IS NOT NULL
      5     DROP TABLE dbo.t1;
      6 GO 
      7 CREATE TABLE t1
      8     (
      9       id INT IDENTITY(1, 1)
     10              PRIMARY KEY ,
     11       a NVARCHAR(2) ,
     12       b NVARCHAR(2)
     13     );
     14 --建立索引a
     15 CREATE NONCLUSTERED INDEX [NonClusteredIndex-20190507-201219] ON [dbo].[t1]
     16 (
     17 [a] ASC
     18 )
     19 INCLUDE (     [b]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
     20 GO
     21 --建立索引b
     22 CREATE NONCLUSTERED INDEX [NonClusteredIndex-20190507-201235] ON [dbo].[t1]
     23 (
     24 [b] ASC
     25 )
     26 INCLUDE (     [a]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
     27 GO
     28 
     29 
     30 
     31 
     32 
     33 WITH    cte_0 ( a, b )
     34           AS ( SELECT   1 ,
     35                         2
     36                UNION ALL
     37                SELECT   1 ,
     38                         3
     39                UNION ALL
     40                SELECT   2 ,
     41                         4
     42                UNION ALL
     43                SELECT   2 ,
     44                         5
     45                UNION ALL
     46                SELECT   2 ,
     47                         3
     48                UNION ALL
     49                SELECT   3 ,
     50                         6
     51                UNION ALL
     52                SELECT   4 ,
     53                         9
     54                UNION ALL
     55                SELECT   5 ,
     56                         7
     57                UNION ALL
     58                SELECT   6 ,
     59                         9
     60                UNION ALL
     61                SELECT   7 ,
     62                         8
     63                UNION ALL
     64                SELECT   8 ,
     65                         10
     66                UNION ALL
     67                SELECT   9 ,
     68                         10
     69                UNION ALL
     70                SELECT   9 ,
     71                         12
     72                UNION ALL
     73                SELECT   10 ,
     74                         11
     75                UNION ALL
     76                SELECT   11 ,
     77                         12
     78              )
     79     INSERT  INTO t1
     80             ( a ,
     81               b
     82             )
     83             SELECT  a ,
     84                     b
     85             FROM    cte_0
     86             UNION ALL
     87             SELECT  b ,
     88                     a
     89             FROM    cte_0;
     90 --加上是否循环的标记(效率较不加循环标记要高)
     91 WITH    cte_a
     92           AS ( SELECT   a ,
     93                         b
     94                FROM     dbo.t1
     95                --UNION ALL
     96                --SELECT   b ,
     97                --         a
     98                --FROM     dbo.t1
     99              ),
    100         cte_b
    101           AS ( SELECT   a ,
    102                         b ,
    103                         0 AS isok ,
    104                         CAST(a + '>' + b AS NVARCHAR(MAX)) AS c_path ,
    105                         1 AS nlevel
    106                FROM     cte_a
    107                WHERE    a = '4'--起点
    108                UNION ALL
    109                SELECT   s.a ,
    110                         s.b ,
    111                         CASE WHEN s.b = '11' THEN 1--如果下一层找到了终点,那么不需要继续向下找
    112                              ELSE 0
    113                         END AS isok ,
    114                         CAST(p.c_path + '>' + s.b AS NVARCHAR(MAX)) AS c_path ,
    115                         p.nlevel + 1
    116                FROM     cte_a AS s
    117                         INNER JOIN cte_b AS p ON p.b = s.a
    118                WHERE    CHARINDEX(s.b, p.c_path) = 0
    119                         AND p.isok = 0
    120              ),
    121         cte_c
    122           AS ( SELECT   *
    123                FROM     cte_b
    124                --WHERE    b = '11'--终点
    125              )
    126     SELECT  *
    127     FROM    cte_c
    128     --WHERE   cte_c.nlevel = ( SELECT MIN(cte_c.nlevel)
    129     --                         FROM   cte_c
    130     --                       );
    像个乞丐

  • 相关阅读:
    CentOS6.4 安装 codeblocks-12.11
    SpringCloud 进阶之Hystrix(断路器)
    SpringCloud 进阶之Ribbon和Feign(负载均衡)
    SpringCloud 进阶之Eureka(服务注册和发现)
    SpringCloud 入门
    SpringBoot与消息(RabbitMQ)
    SpringBoot 与缓存
    SpringBoot 之数据访问
    Spring Data 之 Repository 接口
    Spring Data之Hello World
  • 原文地址:https://www.cnblogs.com/felix22/p/11104012.html
Copyright © 2011-2022 走看看