SQL难点总结

一 、翻转输出一个表,就是行变列 列变行。比如:某表数据是:
field1  field2  field3
----------------------
a       b       c
d       e       f

用select得到
d       a
e       b
f       c

或者
a       d
b       e
c       f

随便用啥数据库,只要能够做出就可以了  (不能使用游标哦。(因为游标要使用到存储过程,不能算)。 

写了一个:
select F1,bf1 from test a join (select id,F1 as bf1 from test) b on b.bf1>a.f1
union
select F2,bf2 from test a join (select id,F2 as bf2 from test) b on b.bf2>a.f2
union
select F3,bf3 from test a join (select id,F3 as bf3 from test) b on b.bf3>a.f3
order by f1

 

解决:

---------------------------

1。如果没有格的要求,可以用一个函数来实现,把一列的东西连起来显示就可以了(当然,这类似以前的一个转置帖子,所以不算我想的)
2。把显示器转90度放置(这是我想的,速度很快,也不多加时间)
3。用动态SQL(我觉得这样不用考虑记录有多少行)下面是我用第三种方法的实现



--1建立环境
create table TBb(
        field1 varchar(5),
        field2 varchar(5),
        field3 varchar(5)
)
--插入数据(略)

--下面是查询(也是我想了好久想到的答案)

begin transaction
       
        declare @v_maxcol int, @v_numcol int
        declare @v_tempsql1 varchar(1000),@v_tempsql2 varchar(1000),
                        @v_tempsql3 varchar(1000),@v_tempsql4 varchar(1000)
        declare @v_data varchar(5)
        set @v_data = '5'

        set @v_numcol = 1
        select @v_maxcol = count(field1) from TBb

        set @v_tempsql1 = 'declare @v_tb table('
        set @v_tempsql2 = 'insert @v_tb values('
        set @v_tempsql3 = 'insert @v_tb values('
        set @v_tempsql4 = 'insert @v_tb values('

        while @v_numcol <= @v_maxcol
        begin
                set @v_tempsql1 = @v_tempsql1 + 'col'+convert(varchar(5),@v_numcol)+' varchar(5),'
                set @v_numcol = @v_numcol + 1
        end
        set @v_tempsql1 = substring(@v_tempsql1,1,len(@v_tempsql1)-1)+')'

        select @v_tempsql2 = @v_tempsql2 + ' '' '+ field1 + ' '', ' from TBb
        set @v_tempsql2 = substring(@v_tempsql2,1,len(@v_tempsql2)-1)+')'

        select @v_tempsql3 = @v_tempsql3 + ' '' '+ field2 + ' '', ' from TBb
        set @v_tempsql3 = substring(@v_tempsql3,1,len(@v_tempsql3)-1)+')'

        select @v_tempsql4 = @v_tempsql4 + ' '' '+ field3 + ' '', ' from TBb
        set @v_tempsql4 = substring(@v_tempsql4,1,len(@v_tempsql4)-1)+')'

        exec(@v_tempsql1+' '+@v_tempsql2+' '+@v_tempsql3+' '+@v_tempsql4+' select * from @v_tb')
commit

 

二、表 userinfo 有两个字段 username (主键,VARCHAR型) ,user_id(INT型)。

    现想将表中所有以jhb 结尾的 记录的 user_id 值替换成username 前半部分与其相同并且最后3个字符是zzb的记录的user_id 的值(如下例中123zzb与123jhb 以及abd5234zzb与abd5234jhb)。

举例:(左侧为原表,右侧为更新后)


username       user_id

123zzb          88
123jhb          77
77894qsd          22365
abd5234zzb          44
abd5234jhb          369 


更新后:


username       user_id

123zzb          88
123jhb          88
77894qsd          22365
abd5234zzb          44
abd5234jhb          44 



123jhb 与123zzb 就最后3位字符串不一样,并且123zzb最后3位是zzb,更新后,应该使得123jhb 的user_id 的值= 123zzb 的user_id 的值。abd5234zzb 以及 ab5234jhb也是一样,更新后,ab5234jhb的user_id 的值应该等于abd5234zzb的user_id的值。 请问如何使用sql 代码实现?允许新增表操作。

解决:

----------------------------------

 

declare @t table(username varchar(50),userid int)
insert into @t
select '123zzb',88
union all
select '123jhb',77
union all
select '77894qsd',22365
union all
select 'abd5234zzb',44
union all
select 'abd5234jhb',369

select * from @t

select *,substring(username,1,len(username)-3) as tt into #tt
from @t
where patindex('%jhb%',username)>0

select username as a,userid as b ,aa=(select userid from @t b 
          where b.username not in (select username from #tt)
          and substring(a.username,1,len(a.username)-3)=substring(b.username,1,len(b.username)-3))
into #dd
from @t a
where patindex('%jhb%',username)=0

update @t
set userid=(select b from #dd where substring(a,1,len(a)-3)=substring(username,1,len(username)-3))
where patindex('%jhb%',username)>0

select * from @t

drop table #tt
drop table #dd

三、

查询分析器中执行就能找到造成阻塞的语句,就是耗资源的

use master
go
declare @spid int,@bl int
DECLARE s_cur CURSOR FOR
select  0 ,blocked
from (select * from sysprocesses where  blocked>0 ) a
where not exists(select * from (select * from sysprocesses where  blocked>0 ) b
where a.blocked=spid)
union select spid,blocked from sysprocesses where  blocked>0
OPEN s_cur
FETCH NEXT FROM s_cur INTO @spid,@bl
WHILE @@FETCH_STATUS = 0
begin
if @spid =0
            select ' 引起数据库死锁的是 : '+ CAST(@bl AS VARCHAR(10)) + ' 进程号 , 其执行的 SQL 语法如下 '
else
            select ' 进程号 SPID : '+ CAST(@spid AS VARCHAR(10))+ ' 被 ' + ' 进程号 SPID : '+ CAST(@bl AS VARCHAR(10)) +' 阻塞 , 其当前进程执行的 SQL 语法如下 '
DBCC INPUTBUFFER (@bl )
FETCH NEXT FROM s_cur INTO @spid,@bl
end
CLOSE s_cur
DEALLOCATE s_cur

exec sp_who2

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值