有关Group by的问题(100分)

  • 主题发起人 主题发起人 barton
  • 开始时间 开始时间
B

barton

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个表TITLES记录所有员工有职称信息,字段有:
ID/主关键字
EID/员工员
TITLE职/称号
PASSDATE/通过日期
APPLYDATE/聘用日期(可以为空)
当然一名员工可以占用多条记录.
现在要得到一个员工最后所受聘的职称--只需要两个字段:
EID
TITLE

这个语句应该如何写?
 
select a.Eid ,a.title
from Titles a, (select id,max(applydate) applydate from title group by id where id=:id) b
where a.id=b.id and a.applydate=b.applydate
 
select a.Eid ,a.title
from Titles a,
(select id,max(applydate) applydate from title group by id ) b
where a.id=b.id
and b.id=:id
and a.applydate=b.applydate

 
hubdog和charles的答案都可以。
hubdog的条件加在子查询上,执行效率可能高一点。
但是,这些SQL语句能否执行,要看是什么数据库了。
至少ORACLE肯定没有问题。

但是最近发现INFORMIX居然不支持子查询,FAINT。

其实如果只查一个人的话,完全可以用更加简单和高效的语句来实现,
而且几乎可以在任何数据库中实现,即将这个员工的所有记录全选出来
(反正一个员工也没有多少记录,不影响效率),选出时按日期倒排序,
则不用考虑,第一条记录就是所要的。
语句如下:

select eid,title from titles
where id=:ID
order by applydate desc
 
看到hubdog和Charles的查询方法很受启发,
但我还是觉得Yck的方法很好,简单实用,
可移置性好,效率高,同时还可以查询到以前的记录,
可能用户某一天会需要查询以前的记录,
这种问题我在实际中曾经遇到过。
 
select eid,title from titles where id=:ID order by applydate desc
Query1.parambyName('id').asString:='12332414'

 
yck 的方法是简单, 且效率高
但是不是索要的答案, 因为关系数据库
中没有第几的概念
还有一种方法
select eid,title
from titles
where eid=:EIDd and applydate=
( select max(applydate) from titles b
where b.eid=:EID)
如果数据量大的话,这个语句比hubdog 和 charles 的语句
的效率高得多, 考虑到分组和排序的费用
如果 已共有n条记录, EID 有m条记录 则
yck : n+ m(m-1)/2
张国龙: n+ m (非相关嵌套子查询之运行一次)
hubdog: n*n

这个问题已经讨论得很充分了, 结果满意吗?

 
错了 ,
张国龙应为 n+n;
 
sql server 中有一种用法: TOP n
如果你只是查一个人的,令 n = 1
 
搞笑啊?
一个人能有多少职称?
3、4个就差不多了,
你所谓的M,M*M有这么区别?
所以M*M<N
再说,子查询的速度能快吗?

 
SELECT TOP 1 eid,title
FROM titles
WHERE id=:ID
ORDER BY applydate DESC
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部