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

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

  • 相关阅读:
    phpstorm+Xdebug断点调试PHP
    解决PHP curl https时error 77(Problem with reading the SSL CA cert (path? access rights?))
    Windows下安装并设置Redis
    PHP使用数据库的并发问题
    PHP 数组排序
    js 异常处理
    nginx php上传大文件的设置(php-fpm)
    第二章 基本数据类型:常见数据类型的方法
    第一章 python介绍、变量、数据类型、流程控制语句等
    python2.x和python3.x的区别
  • 原文地址:https://www.cnblogs.com/huaxiaoyao/p/2129940.html
Copyright © 2011-2022 走看看