SQL问题,急急!!!

来源:百度知道 编辑:UC知道 时间:2024/05/22 20:28:44
表worker结构如下
CODE VARCHAR2(2), NOT NULL 编码
NAME VARCHAR2(30), NOT NULL 姓名
DEPARTMENT VARCHAR2(10) NULL 部门
DARDAY VARCHAR2(10) 发薪日期,存储格式。yyyy/mm/dd
PAYMENT NUMBER(14.2) 薪水
请写出下面两个查询的SQL的脚本。
(1)取出2003年四月发薪水最多的部门。
(2)取出所有曾经1个月发薪水1次以上的人员编码,姓名,发薪年月,发薪次数,发薪总数,

编写SQL时提高性能的注意事项,SQL执行计划几种使用场合!

1.
select top 1 department,sum(payment) 总薪水
from worker
where left(darday,7)='2003/04'
group by department
order by 2 desc

第二个用oracle的语法可以做,sql server无法一次性表述,需要做下处理才能做
2.
select a.*,b.发薪总数
(select code 编码,name 姓名,left(darday,7) 发薪年月,count(*) 发薪次数
from worker a
group by code,name,left(darday,7)
having count(*)>1) a
left join (select code,name count(*) 发薪总数
from worker
group by code,name ) b
on a.code=b.code and a.name=b.name

oracle:
select code 编码,name 姓名,substr(darday,1,7) 发薪年月,count(*) 发薪次数
from worker
group by rollup (code,substr(darday,1,7))
having count(*)>1

至于提高性能,我们来对第二题的sql server方法做下优化。很显然,我上面的方法是最不优化的。因为在做左连接的时候又做了一次和第一次查询接近的查询。数据库里有个临时表的概念,我们可以利用临时表对查询结果进行保存,方便后面的再次查询。以此为例,我们做一下调优:

--先建立临时表

select code 编码,name 姓名,left(darday,7) 发薪年月,count(*) 发薪次数
into #temp_1212
from worker a