多表查询排序筛选问题

im502 2007-03-21 11:07:02
3个表:
bumen:
-----------------------------------------
| bm | bms |
-----------------------------------------
| 01 | 生产基地 |
-----------------------------------------
| 02 | 生产部 |
-----------------------------------------
| 03 | 办公室 |
-----------------------------------------
| 04 | 资材部 |


doc:

-------------------------------------------------------------------
| bh | xm | xb | bm |
---------------------------------------------------------------------
| 010001 | aaaa | 男 | 01 |
-------------------------------------------------------------------
| 010002 |bbbb | 女 | 01 |
---------------------------------------------------------------------
| 010044 | cccc | 男 | 01 |
-------------------------------------------------------------
| 010045 | dddd | 女 | 01 |
| 020008 |eeee | 男 | 02 |
----------------------------------------------------------------
| 010031 | ffffff | 男 | 02 |
------------------------------------------------------------------
| 020011 | ggggg | 女 | 02 |
----------------------------------------------------------------
| 020012 | eeeee | 男 | 02 |
-------------------------------------------------------------------
| 07006 | wwwww | 女 | 07 |
----------------------------------------------------------------

sfdata:

-------------------------------------------------------------
| bh | ye | rq |
-------------------------------------------------------------
| 010001 | 3000 | 20041012 |
-------------------------------------------------------------
| 010001 | 3000 | 20041012 |
-------------------------------------------------------------
| 010001 | 2970 | 20041014 |
-------------------------------------------------------------
| 010031 | 1700 | 20050323 |
-------------------------------------------------------------
| 010031 | 1400 | 20050323 |
-------------------------------------------------------------
| 010031 | 600 | 20050331 |
-------------------------------------------------------------

要实现的查询是:查出xm或bh对应的ye,要求rq最大的条件下ye最小
bh | xm | xb | bms | ye | rq
010001 |aaaa |男 | 生产基地|2970 |20041014
010031 |fffff |男 | 生产部 |600 |20041014


数据量挺大的,用的ACCESS数据库,我写的SQL:

select * from (select sfdata.bh,xm,xb,bms,ye,rq from bumen,doc,sfdata where bumen.bm=doc.bm and sfdata.bh=doc.bh order by sfdata.bh asc,rq desc,ye asc)

查不来的只是按要求排序了,并没有取出来每个编号的第一条记录,请问怎样消除重复的记录?

或者有更好的方法实现呢?
...全文
252 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
im502 2007-03-22
  • 打赏
  • 举报
回复
下面这段语句效率高,而且符合我的要求:
select D.bh,D.xm,D.xb,M.bms,B.minYe,B.maxDate
from (doc D inner join
(select
A.bh,
A.maxDate,
(select Min(ye)
from sfdata
where bh=A.bh and rq=A.maxDate) as minYe
from (
select bh,Max(rq) as maxDate
from sfdata
group by bh) A
) B on D.bh=B.bh)
inner join bumen M
on D.bm=M.bm
wwwwb 2007-03-21
  • 打赏
  • 举报
回复
or
select * from ((select * from sfdata a where rq in
(select top 1 rq from sfdata where bh=a.bh order by rq desc)) c
left join doc d on c.bh=d.bh)
left join bumen e on d.bm=e.bm
wwwwb 2007-03-21
  • 打赏
  • 举报
回复
用你给出的数据测试通过,除非你的数据有问题 OR 有重复的记录。
上传MDB到www.access911.net/csdn
im502 2007-03-21
  • 打赏
  • 举报
回复
提示:子查询最多能返回一个记录。
wwwwb 2007-03-21
  • 打赏
  • 举报
回复
select * from ((select * from sfdata a where rq=
(select top 1 rq from sfdata where bh=a.bh order by rq desc)) c
left join doc d on c.bh=d.bh)
left join bumen e on d.bm=e.bm
OracleRoob 2007-03-21
  • 打赏
  • 举报
回复
in效率低。
im502 2007-03-21
  • 打赏
  • 举报
回复
晕了,还是有错,我给把逻辑关系搞错了,应该是先rq后ye 我写成rq and ye了,且的关系了,查询错误了,丢失了好多数据,呜呜呜呜呜呜呜呜!
还是搞不定啊!
im502 2007-03-21
  • 打赏
  • 举报
回复
另外我试了你的那俩条语句 一个是用的是= 另一个用的是in
用in执行的时候总是超时,数据量有些大。
im502 2007-03-21
  • 打赏
  • 举报
回复
对就是你说的:RQ最大时有多条重复的记录,在这些记录中取ye最小的那一条记录,因为数据库里的数据量特别大有100多万条,还涉及到别的没有列出的字段,我也懒得整理测试数据了,我现在根据你的语句自己加了一个条件,目的达到了。多谢了,结帖给分。
另外我想再在查询结果上加上一个SELECT DISTINCT * FROM 该怎么操作 ,因为数据表里有重复数据,我现在的做法是先把重复的数据清空了,再执行下面的查询:

SELECT c.bh, d.xm, d.xb, e.bms, c.ye, c.rq
FROM (SELECT *
FROM sfdata a
WHERE rq =
(SELECT TOP 1 rq
FROM sfdata
WHERE bh = a.bh
ORDER BY rq DESC) AND ye =
(SELECT TOP 1 ye
FROM sfdata
WHERE bh = a.bh
ORDER BY ye ASC)) c LEFT OUTER JOIN
Doc d ON c.bh = d.bh LEFT OUTER JOIN
Bumen e ON d.bm = e.bm
ORDER BY d.xm
wwwwb 2007-03-21
  • 打赏
  • 举报
回复
并不是显示rq最大的记录里ye最小的那一条记录
不太明白你的意思,RQ最大,YE不一定最小,

是否是:RQ最大时有多条重复的记录,在这些记录中取ye最小的那一条记录?
如是,重新整理数据并将正确结果贴出来看看,即SFDATA中的数据。

OR
上传MDB到www.access911.net/csdn
im502 2007-03-21
  • 打赏
  • 举报
回复
感谢wwwwb 的帮助,报错可能是我的数据表里有空数据造成的,删除了空数据就不报错了
但是这段sql语句还是没有达到我的目的,可能测试数据的问题吧,如果sfdata表里某个bh在同一个rq有几条记录ye都不一样,它会都查出来的,并不是显示rq最大的记录里ye最小的那一条记录

7,714

社区成员

发帖
与我相关
我的任务
社区描述
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点。
社区管理员
  • Access
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧