sql语句的多种写法

原创 2004年07月06日 18:08:00

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写法

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
  • 193

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

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

SQL Update的四种常见写法

/* 实验对象:两个学生表 1. 一个stu学生表,一个stu1学生表. 2. 上述表有三个字段 (学生id,学生性别,学生名字) *//* update语句常见场景,分为两大类...
  • wuya814070935
  • wuya814070935
  • 2017年05月24日 13:16
  • 2113

关于mybatis动态SQL语句的写法

由于mybatis是一个轻量级的框架,SQL语句shi自己写的,可以不断的优化SQL语句,提高查询的效率,近来用到了动态SQL,写了一些简单的SQL语句,如下所示: ...
  • XXSession
  • XXSession
  • 2017年11月01日 19:10
  • 514

怎样写防止Sql注入的Sql语句

1.什么是SQL注入     所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 2.如何防止SQL注入 防止SQL...
  • xuanwuziyou
  • xuanwuziyou
  • 2015年01月12日 14:11
  • 2337

sql语句左外连接与右外连接的写法

sql语句左外连接与右外连接的写法
  • u013538390
  • u013538390
  • 2015年02月28日 14:17
  • 3079

解析SQL语句中INSERT语句的另一种写法

   今天一个偶然的机会中知道 SQL 中的 INSERT 语句还可以这样写: INSERT INTO tbl_name (col1, col2) VALUES (value1_1, value1_2...
  • Star8816
  • Star8816
  • 2008年10月08日 15:11
  • 5735

标准Sql语句的写法

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

MySql 中sql IF写法

( IF(di.typeof=0,'普通发货',( IF(di.typeof=1,'密码券','优惠券') ) ) ) AS '交易类型',
  • LoveJavaYDJ
  • LoveJavaYDJ
  • 2011年05月04日 11:16
  • 3448

冒泡排序的多种写法、逻辑

冒泡排序的多种写法、逻辑 1 Bubble Sort 上推分类法 2 Bubble Sort 冒泡排序 - 根据下标 3 Bubble Sort 冒泡排序 - 根据轮数...
  • ChinarCSDN
  • ChinarCSDN
  • 2017年12月26日 23:40
  • 72
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sql语句的多种写法
举报原因:
原因补充:

(最多只允许输入30个字)