做了几天报表,有了点心得,贴出来给大家分享,以备日后忘了上来查查。
1. 取结果集的第一条记录。。。。。。。。。。。。。这个被人问过不下200次了
这个当然用程序可以实现,用SQL可以实现,但是不同的数据库实现起来不一样
select * from (select rownum id ,t.* from llclaimdetail t order by caseno) tt where tt.id=1
当然还有一种方法就是如果是按某一列筛选的话 max(),min()也是个讨巧的办法
2. 按某一列排序
这种实现有通用语法order by tt asc(desc)
但是假如你懒得想这列叫什么名字的时候我们只要这么写:
Order by 1 ß 按第一列排序。
3. 分组显示
Order by 和 group by 都有分组的功能,group by 的要求相应苛刻一些。这个大家可以灵活的试一试。
4. union
本人对jnio掌握得还不好相应部分会在以后补上,这里说个简单的union all
是把相同的记录条目相加
select a,
b,
sum(c)
from (
select item
1
a
, item1 2 b, sum(item3) c
from tableaa tc
where aa=’
1’
group by a, b
union all
select item
1
a
, item1 2 b, sum(item3) c
from tablebb tc
where bb=’
1’
group by a, b
)
看懂没。
5. 连表的替代法
连表就是我们理解的 select * from a,b where a.id=b.id 这样就把两个表相同id的记录作了个全连接。
有的时候我们只是要求某一列是同过这个表里的某几个字段查别的表,但这个字段不是主键,如果这个时候还用这样的连表,就会逻辑混乱。
我们只要这样:
Select
(select a from aa where aa.c=bb.c),
(select a from cc where cc.e=bb.e)
from bb
6. 嵌套的效率
嵌套的效率比连表的效率低很多,特别是MYSQL对嵌套查询支持的不好,一般一个嵌套就死机了。
所以在嵌套这个问题上面如果逻辑上面自己能绕得过来的,最好都写成连表的形式。
7. 分支
写惯了程序用if else用的爽爽的一到SQL里面用到分支的就范蒙,想想是不是要用函数啊,是不是要写存储过程啊,是不是要把SQL和程序混合的实现功能啊,当然都行,条条大路通罗马嘛。
SQL的分支语法是:
Case xx when 条件1 then 实际数据(select aa from cc)
when 条件2 then 实际数据(select aa from cc)
else 实际数据(select aa from cc)
end
红色部分是必须有的部分,其他是可有可无的。这个SQL你可以灵活的嵌套以上所说的任何一种情况,嵌套多少层都可以。
例如:
select (case ont
when '4' then ono
else (case SUBSTR(ono, -2, 2)
when '99' then (case (select count(*) from lgc where gcn = ono)
when 0 then (select pn from bgc where gcn = ono)
else (select pn from lgc where gcn = ono)
end)
when '88' then(case (select count(*) from cc where cn = ono)
when 0 then (select pn from bc where cn = ono)
else (select pn from cc where cn = ono)
end)
end)
end),
cc
from table
看得懂就理解一下。
8. Oracle函数
这个就请大家再往上查一下Oracle函数的文档拉,函数是很全的,我的例子里面就用到了一个字符串函数。