sql语句的多种写法

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语句的多种写法)