一些t-sql技巧

发表于:2008-7-22 16:08

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:网络转载

分享:

  七、 分区视图


  分区视图是提高查询性能的一个很好的办法

  --看下面的示例

  --示例表
  create table tempdb.dbo.t_10(
  id int primary key check(id between 1 and 10),name varchar(10))

  create table pubs.dbo.t_20(
  id int primary key check(id between 11 and 20),name varchar(10))

  create table northwind.dbo.t_30(
  id int primary key check(id between 21 and 30),name varchar(10))
  go

  --分区视图
  create view v_t
  as
  select * from tempdb.dbo.t_10
  union all
  select * from pubs.dbo.t_20
  union all
  select * from northwind.dbo.t_30
  go

  --插入数据
  insert v_t select 1 ,'aa'
  union  all select 2 ,'bb'
  union  all select 11,'cc'
  union  all select 12,'dd'
  union  all select 21,'ee'
  union  all select 22,'ff'

  --更新数据
  update v_t set name=name+'_更新' where right(id,1)=1

  --删除测试
  delete from v_t where right(id,1)=2

  --显示结果
  select * from v_t
  go

  --删除测试
  drop table northwind.dbo.t_30,pubs.dbo.t_20,tempdb.dbo.t_10
  drop view v_t

  /**//*--测试结果

  id          name     
  ----------- ----------
  1          aa_更新
  11          cc_更新
  21          ee_更新

  (所影响的行数为 3 行)
  ==*/

  八、 树型的实现

  --参考

  --树形数据查询示例
  --作者: 邹建

  --示例数据
  create table [tb]([id] int identity(1,1),[pid] int,name varchar(20))
  insert [tb] select 0,'中国'
  union  all  select 0,'美国'
  union  all  select 0,'加拿大'
  union  all  select 1,'北京'
  union  all  select 1,'上海'
  union  all  select 1,'江苏'
  union  all  select 6,'苏州'
  union  all  select 7,'常熟'
  union  all  select 6,'南京'
  union  all  select 6,'无锡'
  union  all  select 2,'纽约'
  union  all  select 2,'旧金山'
  go

  --查询指定id的所有子
  create function f_cid(
  @id int
  )returns @re table([id] int,[level] int)
  as
  begin
  declare @l int
  set @l=0
  insert @re select @id,@l
  while @@rowcount>0
  begin 
    set @l=@l+1 
    insert @re select a.[id],@l 
    from [tb] a,@re b 
    where a.[pid]=b.[id] and b.[level]=@l-1
  end
  /**//**//**//*--如果只显示最明细的子(下面没有子),则加上这个删除
  delete a from @re a
  where exists( 
    select 1 from [tb] where [pid]=a.[id])
  --*/
  return
  end
  go

  --调用(查询所有的子)
  select a.*,层次=b.[level] from [tb] a,f_cid(2)b where a.[id]=b.[id]
  go

  --删除测试
  drop table [tb]
  drop function f_cid
  go

  九、 排序问题

  CREATE TABLE [t] (
  [id] [int] IDENTITY (1, 1) NOT NULL ,
  [GUID] [uniqueidentifier] NULL
  ) ON [PRIMARY]
  GO

  下面这句执行5次

insert t values (newid())

  查看执行结果

select * from t

  1、 第一种

  select * from t
  order by case id when 4 then 1
                  when 5 then 2
                  when 1 then 3
                  when 2 then 4
                  when 3 then 5 end

  2、 第二种

select * from t order by (id+2)%6

  3、 第三种

select * from t order by charindex(cast(id as varchar),'45123')

  4、 第四种

  select * from t
  WHERE id between 0 and 5
  order by charindex(cast(id as varchar),'45123')

  5、 第五种

select * from t order by case when id >3 then id-5 else id end

  6、 第六种

select * from t order by id / 4 desc,id asc


  十、 一条语句删除一批记录

  首先id列是int标识类类型,然后删除ID值为5,6,8,9,10,11的列,这里的cast函数不能用convert函数代替,而且转换的类型必须是varchar,而不能是char,否则就会执行出你不希望的结果,这里的"5,6,8,9,10,11"可以是你在页面上获取的一个chkboxlist构建成的值,然后用下面的一句就全部删除了,比循环用多条语句高效吧应该。

delete from [fujian] where charindex(','+cast([id] as varchar)+',',','+'5,6,8,9,10,11,'+',')>0

  还有一种就是

delete from table1 where id in(1,2,3,4 )

   十一、获取子表内的一列数据的组合字符串

   下面这个函数获取05年已注册了的某个所的律师,唯一一个参数就是事务所的名称,然后返回zhuce字段里包含05字样的任何律师。

   CREATE

   FUNCTION fn_Get05LvshiNameBySuo

   (@p_suo Nvarchar(50))RETURNS Nvarchar(2000)ASBEGINDECLARE @LvshiNames varchar(2000), @name varchar(50)select @LvshiNames=''DECLARE lvshi_cursor CURSOR FOR

22/2<12
精选软件测试好文,快来阅读吧~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号