zoukankan      html  css  js  c++  java
  • 在论坛中出现的比较难的sql问题:28(循环查询表来实现递归)

    最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。

    所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。


    问题:怎么循环查询一个表 用递归吗?

    有2张表B1和B2,B1是主表,
    B1的BID是对应B2的B2ID,
    B1和B2d是一对多的关系,
    B2ID下还有以它为父节点的数据,测试数据如下:

    B1
    BIDsname
    1266  JM          
    1286  DM
    ......        

    B2
    B2IDSID
    1266  DH1500          
    1266  DH1592
    1266  DH1595
    DH1500  E89876
    DH1500  E89896

    联合2表查询,要得到这样的结果:
    MainIDSID
    1266DH1500
    1266DH1592
    1266DH1595
    DH1500  E89876
    DH1500  E89896

    这个怎么查?求解 

    我的方法:

    if object_id('[B1]') is not null drop table [B1]
    go 
    create table [B1]([BID] varchar(6),[sname] varchar(2))
    insert [B1]
    select '1266','JM' union all
    select '1286','DM'
    
    if object_id('[B2]') is not null drop table [B2]
    go 
    create table [B2]([B2ID] varchar(6),[SID] varchar(6))
    insert [B2]
    select '1266','DH1500' union all
    select '1266','DH1592' union all
    select '1266','DH1595' union all
    select 'DH1500','E89876' union all
    select 'DH1500','E89896'
    go
    
    
    
    --1.定义表变量
    
    DECLARE @a VARCHAR(10)
    SET @a='JM'
    
    declare @tb table
    ([B2ID] varchar(6),
    [SID] varchar(6),
    level int       --层级
    )
    
    
    --2.递归开始  
    insert into @tb 
    SELECT a.* ,1 [level]
    FROM b2 a LEFT JOIN b2 b ON b.SID=a.b2id
    WHERE b.b2id IS NULL AND b.SID IS NULL AND a.b2id IN (SELECT bid FROM b1 WHERE [sname]=@a)
    
    
    --3.递归的过程
    while @@ROWCOUNT > 0
    begin
        
        insert into @tb
    	select b.[B2ID],b.[SID],level + 1
    	from @tb t
    	inner join B2 b
    			on b.b2id =t.SID
        where not exists(select 1 from @tb t2 
                         where t.level < t2.level)
    end
    
    
    --4.最后查询
    SELECT b2id MainID    ,SID
     FROM  @tb
    /*
    MainID	SID
    1266	DH1500
    1266	DH1592
    1266	DH1595
    DH1500	E89876
    DH1500	E89896
    */
    
  • 相关阅读:
    信息化与信息系统4
    信息化与信息系统3
    信息化与信息系统2
    信息化与信息系统1
    ASP.NET Core教程:ASP.NET Core 程序部署到Windows系统
    C#几种单例模式
    SQL查询优化
    动态类型dynamic(ExpandoObject)
    PV(访问量)、UV(独立访客)、IP(独立IP)
    Spring Boot 2.配置
  • 原文地址:https://www.cnblogs.com/momogua/p/8304487.html
Copyright © 2011-2022 走看看