返回数据表中指定的前几行记录信息?用SQL语句如何实现?高人一定要进来看看

时间:2021-09-13 01:03:21
比如在表1中有如下数据:
水果店编号                      水果种类          销售数量
1                                苹果                 1250
1                                香蕉                 1326
1                                西瓜                 236
1                                西红柿             2365
1                                草莓                 3695
2                                苹果                 2250
2                                香蕉                 2326
2                                西瓜                 1364
2                                西红柿             1365
2                                草莓                 2695
.
.
.

问题:
如何通过SQL语句,显示出每家水果店的前几行记录(比如显示前3行记录),应该如何实现呢?
实现后的效果如下:
水果店商店编号                  水果种类          销售数量
1                                苹果                 1250
1                                香蕉                 1326
1                                西瓜                 236
2                                苹果                 2250
2                                香蕉                 2326
2                                西瓜                 1364

9 个解决方案

#1


SELECT *,RECNO() as bz FROM r:\temp\tth INTO CURSOR ttha
SELECT * FROM ttha a WHERE 3>(select COUNT(*) FROM ttha WHERE a.水果店编号=水果店编号 AND a.bz>bz)

#2


引用 1 楼 WWWWA 的回复:
SELECT *,RECNO() as bz FROM r:\temp\tth INTO CURSOR ttha
SELECT * FROM ttha a WHERE 3>(select COUNT(*) FROM ttha WHERE a.水果店编号=水果店编号 AND a.bz>bz)


兄弟可否解释一下,看不太懂呢 

#3


是用VFP吧?
表中没有唯一标识的字段,用
RECNO() 生成,再取前3条记录

SELECT a.水果店编号,a.水果种类,a.bz,count(*) FROM ttha a 
left join ttha b on 
a.水果店编号=b.水果店编号 AND a.bz>b.bz
group by a.水果店编号,a.水果种类,a.bz

看看结果就知道了

#4


引用 3 楼 WWWWA 的回复:
是用VFP吧?
表中没有唯一标识的字段,用
RECNO() 生成,再取前3条记录

SELECT a.水果店编号,a.水果种类,a.bz,count(*) FROM ttha a 
left join ttha b on 
a.水果店编号=b.水果店编号 AND a.bz>b.bz
group by a.水果店编号,a.水果种类,a.bz

看看结果就知……


我没有用过VFP,就是想求一条能够支持DBF数据表操作的SQL语句,因为在现成的软件里有一个能支持SQL语句的查询的窗口,上面提到的DBF表是从oracle数据库里自动生成出来的。

#5


你发了4个帖子问这个问题,加入自增字段ID

vfp9:
加入自增字段ID
ALTER table ttt ADD id i AUTOINC

SELECT * FROM tth a WHERE 3>(select COUNT(*) FROM tth WHERE a.水果店编号=水果店编号 AND a.id>id)

否则在DBF中加入唯一标识的字段

#6


如果销售数量唯一

SELECT * FROM tth a WHERE 3>(select COUNT(*) FROM tth WHERE a.水果店编号=水果店编号 AND a.销售数量>销售数量)

#7


引用 6 楼 wwwwb 的回复:
如果销售数量唯一

SELECT * FROM tth a WHERE 3>(select COUNT(*) FROM tth WHERE a.水果店编号=水果店编号 AND a.销售数量>销售数量)


表里好像没有唯一的值,在不要改变表整体结构的情况下 有办法实现吗?因为表的结构我没有权限改变。我只能通过SQL语句来实现。需要支持ACCESS数据库操作的SQL语句
麻烦了。。。

#8



你这里前三行是什么意思呢?记录产生的先后顺序?销售数量的多少?

如果是记录产生时的顺序,那么你必须给记录增加一个时间属性、或者序号。SQL是基于集合的操作,和记录的实际存储位置无关、和记录存入的先后顺序无关,它不会自动考虑记录产生的时间、位置问题。

如果是销售数量,那么先排一下序。现在的SQL工具,一般都支持按排序取前若干位或若干百分比,VFP在这方面还属于行动比较早的,查VFP关于SQL Select的说明吧。

#9


将wwwwb的改了一下,能够达到楼主的要求了——每个店销量前3名的列出:
SELECT *,RECNO() as bz FROM r:\temp\tth INTO CURSOR ttha ReadWrite Order By 水果店编号,销售数量 Desc  &&增加 ReadWrite Order By 水果店编号,销售数量 Desc 
BROWSE
Update ttha Set bz=Recno()  && 增加这句
SELECT 水果店编号,水果种类,销售数量 FROM ttha a WHERE 3>(select COUNT(*) FROM ttha WHERE a.水果店编号=水果店编号 AND a.bz>bz)

#1


SELECT *,RECNO() as bz FROM r:\temp\tth INTO CURSOR ttha
SELECT * FROM ttha a WHERE 3>(select COUNT(*) FROM ttha WHERE a.水果店编号=水果店编号 AND a.bz>bz)

#2


引用 1 楼 WWWWA 的回复:
SELECT *,RECNO() as bz FROM r:\temp\tth INTO CURSOR ttha
SELECT * FROM ttha a WHERE 3>(select COUNT(*) FROM ttha WHERE a.水果店编号=水果店编号 AND a.bz>bz)


兄弟可否解释一下,看不太懂呢 

#3


是用VFP吧?
表中没有唯一标识的字段,用
RECNO() 生成,再取前3条记录

SELECT a.水果店编号,a.水果种类,a.bz,count(*) FROM ttha a 
left join ttha b on 
a.水果店编号=b.水果店编号 AND a.bz>b.bz
group by a.水果店编号,a.水果种类,a.bz

看看结果就知道了

#4


引用 3 楼 WWWWA 的回复:
是用VFP吧?
表中没有唯一标识的字段,用
RECNO() 生成,再取前3条记录

SELECT a.水果店编号,a.水果种类,a.bz,count(*) FROM ttha a 
left join ttha b on 
a.水果店编号=b.水果店编号 AND a.bz>b.bz
group by a.水果店编号,a.水果种类,a.bz

看看结果就知……


我没有用过VFP,就是想求一条能够支持DBF数据表操作的SQL语句,因为在现成的软件里有一个能支持SQL语句的查询的窗口,上面提到的DBF表是从oracle数据库里自动生成出来的。

#5


你发了4个帖子问这个问题,加入自增字段ID

vfp9:
加入自增字段ID
ALTER table ttt ADD id i AUTOINC

SELECT * FROM tth a WHERE 3>(select COUNT(*) FROM tth WHERE a.水果店编号=水果店编号 AND a.id>id)

否则在DBF中加入唯一标识的字段

#6


如果销售数量唯一

SELECT * FROM tth a WHERE 3>(select COUNT(*) FROM tth WHERE a.水果店编号=水果店编号 AND a.销售数量>销售数量)

#7


引用 6 楼 wwwwb 的回复:
如果销售数量唯一

SELECT * FROM tth a WHERE 3>(select COUNT(*) FROM tth WHERE a.水果店编号=水果店编号 AND a.销售数量>销售数量)


表里好像没有唯一的值,在不要改变表整体结构的情况下 有办法实现吗?因为表的结构我没有权限改变。我只能通过SQL语句来实现。需要支持ACCESS数据库操作的SQL语句
麻烦了。。。

#8



你这里前三行是什么意思呢?记录产生的先后顺序?销售数量的多少?

如果是记录产生时的顺序,那么你必须给记录增加一个时间属性、或者序号。SQL是基于集合的操作,和记录的实际存储位置无关、和记录存入的先后顺序无关,它不会自动考虑记录产生的时间、位置问题。

如果是销售数量,那么先排一下序。现在的SQL工具,一般都支持按排序取前若干位或若干百分比,VFP在这方面还属于行动比较早的,查VFP关于SQL Select的说明吧。

#9


将wwwwb的改了一下,能够达到楼主的要求了——每个店销量前3名的列出:
SELECT *,RECNO() as bz FROM r:\temp\tth INTO CURSOR ttha ReadWrite Order By 水果店编号,销售数量 Desc  &&增加 ReadWrite Order By 水果店编号,销售数量 Desc 
BROWSE
Update ttha Set bz=Recno()  && 增加这句
SELECT 水果店编号,水果种类,销售数量 FROM ttha a WHERE 3>(select COUNT(*) FROM ttha WHERE a.水果店编号=水果店编号 AND a.bz>bz)