sql语句的多种写法

标签: sql table oracle scroll function query
2570人阅读 评论(0) 收藏 举报

sql formatter 1 2

精妙SQL语句

Bill Gates 眼中的聪明人
不可不看:人生十二个经典的感悟

精妙SQL语句介绍

Oracle Union All Query

根据指定ID,返回包含该ID的所有父级记录

一个DETAIL 表,
item ,empid, money
1       001    100
2       001     150
...    ...     ...

一个 TOTAL 表,
empid ,  money
目的是想把DETAIL 表的每个empid 的数据汇总插入到TOTAL 表中,
写的语句是这样地,
写法1:
  update total a set
 money=(select sum(nvl(money,0))
  from detail  where a.empid= empid group by
empid  )

写法2:(有些不通用)
drop table total;
create table total as select empid,sum(nvl(money,0)) money from detail group by empid;
写法3:
update total a set
 money=(select sum(nvl(money,0))
  from detail where a.empid= empid )
写法4:
update total a set
               money=(select sum(nvl(b.money,0))
               from detail b where a.empid=b.empid )
where exists (select 1 from detail b where a.empid=b.empid );

Q]如何使用Hint提示
[A] 在select/delete/update后写/*+ hint */
如 select /*+ index(TABLE_NAME INDEX_NAME) */ col1...
注意/*和+之间不能有空格
如用hint指定使用某个索引

  select /*+ index(cbotab) */ col1 from cbotab;
  select /*+ index(cbotab cbotab1) */ col1 from cbotab;
  select /*+ index(a cbotab1) */ col1 from cbotab a;
  其中
   TABLE_NAME是必须要写的,且如果在查询中使用了表的别名,在hint也要用表的别名来代替表名;
INDEX_NAME可以不必写,Oracle会根据统计值选一个索引;
   如果索引名或表名写错了,那这个hint就会被忽略;

 

CREATE PROCEDURE dbo.PostGetPostByPage

 (
  @page int,
  @forumid int,
  @topornot int
 )

AS
 /* SET NOCOUNT ON */
 declare @begin int,@end int,@f int,@l int,@count int,@top int
 
 select @top=count(*) from Posts as p1 where p1.PostID=(select min(PostID) from Posts as p2 where p1.ThreadID=p2.ThreadID)
 and p1.ForumID=@forumid and PostType=4
 
 if @topornot=1
 
 select p1.PostType,p1.Title,p1.UserName,p1.TotalViews,p1.PostID,p1.ThreadID,p1.ForumID,FileName,
 Reply=(select Count(*) from Posts as p2 where p1.ThreadID=p2.ThreadID)-1,
 LastDate=(select Max(PostDate)from Posts as p2 where p1.ThreadID=p2.ThreadID),
 LastWriter=(select UserName from posts as p2 where p2.PostID=(select Max(PostID)from Posts as p2 where p1.ThreadID=p2.ThreadID))
 from Posts as p1 where p1.PostID=(select min(PostID) from Posts as p2 where p1.ThreadID=p2.ThreadID)
 and p1.ForumID=@forumid and PostType=4
 
 else if @topornot=2
 begin
 
 select @count=count(*) from Posts as p1 where p1.PostID=(select min(PostID) from Posts as p2 where p1.ThreadID=p2.ThreadID)
 and p1.ForumID=@forumid and PostType<>4
 
 declare my_cursor SCROLL CURSOR for
 select p1.PostID from Posts as p1 where p1.PostID=(select min(PostID) from Posts as p2 where p1.ThreadID=p2.ThreadID)
 and p1.ForumID=@forumid and PostType<>4 order by (select max(PostID) from Posts as p2 where p1.ThreadID=p2.ThreadID) desc
 open my_cursor
 
 
 
 if @count+@top<25 and @page=1
 begin
 select @f=1
 select @l=@count
 end
 if @count+@top>=25 and @page=1
 begin
 select @f=1
 select @l=25-@top
 end
 
 if(@page*25-@top>@count) and @page>1
 begin
 select @f=(@page-1)*25+1-@top
 select @l=@count
 end
 if(@page*25-@top<=@count) and @page>1
 begin
 select @f=(@page-1)*25+1-@top
 select @l=@page*25-@top
 end
 
 
 fetch absolute @f from my_cursor into @begin
 fetch absolute @l from my_cursor into @end
 set nocount off
  
 select p1.PostType,p1.Title,p1.UserName,p1.TotalViews,p1.PostID,p1.ThreadID,p1.ForumID,FileName,
 Reply=(select Count(*) from Posts as p2 where p1.ThreadID=p2.ThreadID)-1,
 LastDate=(select Max(PostDate)from Posts as p2 where p1.ThreadID=p2.ThreadID),
 LastWriter=(select UserName from posts as p2 where p2.PostID=(select Max(PostID)from Posts as p2 where p1.ThreadID=p2.ThreadID))
 from Posts as p1 where p1.PostID=(select min(PostID) from Posts as p2 where p1.ThreadID=p2.ThreadID)
 and p1.ForumID=@forumid and PostID<=@begin and PostID>=@end and PostType<>4 order by (select max(PostID) from Posts as p2 where p1.ThreadID=p2.ThreadID) desc
 
 close my_cursor
 end
 RETURN @@Rowcount

GO

----------

以下为一数据内容:

字段: 员工卡号(nvarchar) 打卡日期(smalldatetime) 打卡时间(smalldatetime)
          687623            2004-5-26              2004-5-26 7:29:00
          687623            2004-5-26              2004-5-26 11:5:00
          687623            2004-5-26              2004-5-26 13:31:00
          687623            2004-5-26              2004-5-26 17:33:00
          687244            2004-5-26              2004-5-26 7:35:00
          687244            2004-5-26              2004-5-26 11:1:00
          687244            2004-5-26              2004-5-26 13:28:00
          687244            2004-5-26              2004-5-26 17:24:00
            :                   :                         :
            :                   :                         :
            :                   :                         :
需达到以下效果:

         员工卡号            打卡日期            打卡明细时间
          687623            2004-5-26     7:29 11:5 13:31 17:33
          687244            2004-5-26     7:35 11:1 13:28 17:24

其中, 打卡明细时间由上表的打卡时间而来


--创建一个合并处理函数(生成打卡明细时间)
create function f_time(
@员工卡号 nvarchar(6),
@打卡日期 smalldatetime
)returns varchar(8000)
as
begin
 declare @re varchar(8000)
 set @re=''
 select @re=@re+' '+convert(char(5),打卡时间,108)
 from 数据表
 where 员工卡号=@员工卡号 and 打卡日期=@打卡日期
 return(stuff(@re,1,1,''))
end
go

--调用函数实现查询
select 员工卡号,打卡日期,打卡明细时间=dbo.f_time(员工卡号,打卡日期)
from 数据表
group by 员工卡号,打卡日期

 

查看评论

【转】常用SQL语句书写技巧

转自:http://jianghaifeng.blogchina.com/3841741.html SQL结构化查询字符串的改写,是实现数据库查询性能提升的最现实、最有效的手段,有时甚至是唯一的手段...
  • BEN1978
  • BEN1978
  • 2006-05-22 23:03:00
  • 2199

标准Sql语句的写法

有次面试非得让我写3表连接查询的标准SQL语句,可是我不知道,我们一般都是直接写而不考虑是否遵循标准,能用即可的。所以检查了一下。具体的如下:(http://blog.chinaunix.net/u/...
  • longronglin
  • longronglin
  • 2008-04-04 15:30:00
  • 9163

如何写出高效率的sql语句

转自 http://jianglin.blog.51cto.com/676726/134264 (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效):      Oracle的解析器按照从...
  • jiary5201314
  • jiary5201314
  • 2016-07-26 20:37:56
  • 4129

Java的SQL语句的写法小结

Java的strSQL的写法确实有时候让人头疼:有 " +让你搞得不是很明白。其实,分开来看就行。识别每个符号的意思即可。"" 是SQL的字符串。是String类型的。 里主要用来字符串操作的。和数据...
  • longronglin
  • longronglin
  • 2006-11-03 15:49:00
  • 2988

SQL语句 插入数据的三种写法

NSERT INTO table1(id, name, address) VALUES(1, ygl, ‘beijing') 适用于T-sql和PL/SQL  SELECT id, name, ad...
  • liuxuewangliang
  • liuxuewangliang
  • 2013-01-12 09:35:45
  • 398

几种使用sql写法

Q表达式 Q表达式可以处理换行、单引号等特殊字符 update t_sys_res_config_sql t    set t.query_sql = q'(long string)'  wher...
  • dong_19890208
  • dong_19890208
  • 2016-04-25 15:55:52
  • 240

sql语句的多种写法

sql formatter 1 2精妙SQL语句 Bill Gates 眼中的聪明人 不可不看:人生十二个经典的感悟精妙SQL语句介绍 Oracle Union All Query根据指定ID,返回包...
  • accesine960
  • accesine960
  • 2004-07-06 18:08:00
  • 2570

sql语句写法

string sql="update use_namzi set u_uspwd="+@apwd+",u_passquest="+@aquest+",u_passansw="+@aanwer+" wh...
  • zky0901
  • zky0901
  • 2008-06-13 11:37:00
  • 313

LINQ体验(18)种写法语句——LINQ to SQL语句

  • 2011年03月05日 22:41
  • 697KB
  • 下载

常用的SQL语句,通用性很强。

  • 2009年07月11日 16:15
  • 66KB
  • 下载
    个人资料
    持之以恒
    等级:
    访问量: 127万+
    积分: 1万+
    排名: 877
    微博交流