查询分类与信息的问题,分个分类一条数据!

qqvip2 2006-07-17 02:28:30
SQL语句实现的是:有分类表和信息表,通过组合搜索,每个分类显示一条相关数据信息(以最大ID的显示)!
-------------
分类表:
ClassTab
-------
ID int 自动编号
CText varchar(10) 分类文字
----------
举例数据有:
ID CText
1 北京
2 上海
3 广州
4 南京
5 重庆

信息表:
InfoTab
--------
ID int 自动编号
CID int 分类ID
IInfo varchar(50) 信息标题
IBody varchar(100) 详细信息
-----------
举例数据有:
ID CID IInfo IBody
1 1 北京1个 北京1内容
2 2 上海1个 上海1内容
3 1 北京2个 北京2内容
4 1 北京3个 北京3内容
5 2 上海2个 上海2内容
6 3 广州1个 广州1内容
7 3 广州2个 广州1内容
8 2 上海3个 上海3内容
9 2 上海4个 上海4内容
10 3 广州4个 广州4内容
11 3 广州5个 广州5内容
12 4 南京1个 南京1内容
13 4 南京2个 南京2内容
14 5 重庆1个 重庆1内容
15 4 南京3个 南京3内容


使用:

SELECT A.ID, A.CText, B.ID AS VID, B.IInfo
FROM ClassTab AS A INNER JOIN InfoTab AS B ON A.ID=B.CID
ORDER BY A.ID, B.ID DESC;


显示出来的结果是:
ID CText VID IInfo
1 北京 4 北京3个
1 北京 3 北京2个
1 北京 1 北京1个
2 上海 9 上海4个
2 上海 8 上海3个
2 上海 5 上海2个
2 上海 2 上海1个
3 广州 11 广州5个
3 广州 10 广州4个
3 广州 7 广州2个
3 广州 6 广州1个
4 南京 15 南京3个
4 南京 13 南京2个
4 南京 12 南京1个
5 重庆 14 重庆1个

我的目的就是要让:ID(ClassTab)不重复出现!
需要实现的结果数据如下:
ID CText VID IInfo
1 北京 4 北京3个
2 上海 9 上海4个
3 广州 11 广州5个
4 南京 15 南京3个
5 重庆 14 重庆1个

以ID为分类,每个分类只显示一条数据,每条数据是这分类的VID(VID是InfoTab的ID)是最大的,ID,CText,VID,Info这四列是必须得列出来的!

本问题是在SQLSERVER2000数据库中实现的,
并以举例数据存为ACCESS数据库文件:
下载地址:http://www.vssky.net/temp/test.mdb
(内有'查询1'跟以上使用的SQL相同的)

请教如何实现呢?谢谢!
...全文
256 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qqvip2 2006-07-17
  • 打赏
  • 举报
回复
嗯,好的,谢谢两位!
fcuandy 2006-07-17
  • 打赏
  • 举报
回复
对于只取一条的确实可以这么做, 效率是要高点.
paoluo 2006-07-17
  • 打赏
  • 举报
回复
效率高些的



SELECT A.ID, A.CText, B.ID AS VID, B.IInfo
FROM ClassTab AS A INNER JOIN
(Select B.* From InfoTab B Inner Join
(Select Max(ID) As ID,CID From InfoTab Group By CID) C
On B.ID=C.ID And B.CID=C.CID) D
ON A.ID=D.CID
ORDER BY A.ID, D.ID DESC
fcuandy 2006-07-17
  • 打赏
  • 举报
回复
将上面子查询里的 where 改为 and


SELECT A.ID, A.CText, B.ID AS VID, B.IInfo
FROM ClassTab AS A
INNER JOIN InfoTab AS B
ON A.ID=B.CID
WHERE 1>(SELECT COUNT(1) FROM InfoTab c WHERE c.CID=B.CID AND c.ID>B.ID)
ORDER BY A.ID, B.ID DESC
fcuandy 2006-07-17
  • 打赏
  • 举报
回复
SELECT A.ID, A.CText, B.ID AS VID, B.IInfo
FROM ClassTab AS A
INNER JOIN InfoTab AS B ON A.ID=B.CID
WHERE 1>(SELECT COUNT(1) FROM InfoTab c WHERE c.CID=B.CID WHERE c.ID>B.ID)
ORDER BY A.ID, B.ID DESC

或者用 NOT EXISTS

可能有手误

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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