• SQL练习题之联接


    联接算法是指sqlserver用于处理联接的物理策略,它支持三种联接算法,嵌套循环(nested loops)合并(merge)以及哈希算法.

    练习题:

    create table dbo.arrays(
    arrid varchar(10) not null primary key,
    array varchar(8000) not null
    )
    go

    insert into arrays(arrid,array)
    values
    ('a','20,223,2544,25567,14'),
    ('B','30,-23433,28'),
    ('C','12,10,8099,12,1200,13,12,14,10,9'),
    ('D','-4,--6,-45678,-2')

    arrid   array

    A   20,223,2544,25567,14
    B   30,-23433,28
    C   12,10,8099,12,1200,13,12,14,10,9
    D   -4,--6,-45678,-2

    想要查询出的结果是:

    arrid   pos   element

    A        1       20

    A        2       223

    .......

    本文摘自inside sqlserver 2008 tsql query

    SELECT arrid,
    array,
    substring(array,n,CHARINDEX(',',array+',',n)-n) as element
    ,n
    ,ROW_NUMBER()
    over(partition by arrid order by n) as rowno
    from dbo.arrays
    join dbo.num
    on n<=DATALENGTH(array)+1
    and SUBSTRING(','+array,n,1)=','

    with split
    as
    (
    select arrid, 1 as pos ,1 as startpos,
    CHARINDEX(',',array+',')-1 as endpos
    from dbo.arrays
    where DATALENGTH(array)>0
    union all
    select a.arrid,
    a.pos
    +1,
    a.endpos
    +2,
    CHARINDEX(',',b.array+',',a.endpos+2)-1
    from split a join
    dbo.arrays b
    on a.arrid = b.arrid
    and CHARINDEX(',',b.array+',',a.endpos+2)>0
    )
    select
    a.arrid,
    a.pos,
    a.startpos,
    a.endpos,
    SUBSTRING(b.array,a.startpos,a.endpos-a.startpos+1) as ele,
    b.array
    from split a join dbo.arrays b
    on a.arrid=b.arrid
    order by a.arrid

     使用了两种不同的方法,第一种方法使用了数字辅助表来生成副本.第二种方法使用CTE.

    第二种方法的定位点是查出字符串中的第一个元素,递归部分是查出下一个元素的值,至到找不到,.

  • 相关阅读:
    软件工程实践总结
    Axios使用总结
    个人作业——软件测评
    结对第二次作业-疫情统计可视化实现
    结对第一次——疫情统计可视化(原型)
    软工实践寒假作业(2/2)
    软工实践寒假作业(1/2)
    Springboot后端接口开发
    个人作业——软件工程实践总结&个人技术博客
    个人作业——软件评测
  • 原文地址:https://www.cnblogs.com/huaxiaoyao/p/2129940.html
Copyright © 2020-2023  润新知