sql如何实现分组查询

select top 1 * from goods where BTypeID =1
select top 1 * from goods where BTypeID =2
select top 1 * from goods where BTypeID =3
select top 1 * from goods where BTypeID =4
在以上的四条sql语句中,如何用一条sql语句实现分组查询,并且每组之查询一条数据,重新构成新的数据
等待中
[b]问题补充:[/b]
数据库是sql 2005 的
[b]问题补充:[/b]
只能查询出一条数据啊,我要的是
同一张表,有四种类别,类别的用BTypeID区分,然后每个类别只查询一条数据,并构成新的数据
[b]问题补充:[/b]
select top 1 * from goods where BTypeID =1
union all
select top 1 * from goods where BTypeID =2
union all
select top 1 * from goods where BTypeID =3
union all
select top 1 * from goods where BTypeID =4

BTypeID是外键,同时是另一张表的主键,以上有没有更简洁的方法啊
[b]问题补充:[/b]
我用struts2 + spring2.5 + hibernate3.2架构的,所以希望各位高手帮我把它能成 HQL 语句的形式,本人学习ssh还不是很熟悉,以后望各位多多指点。谢谢!
[b]问题补充:[/b]
select top 1 * from goods where BTypeID =1
select top 1 * from goods where BTypeID =2
select top 1 * from goods where BTypeID =3
select top 1 * from goods where BTypeID =4

SELECT * FROM goods g WHERE ID in(SELECT TOP 1 ID FROM goods y WHERE g.BTypeID = y.BTypeID)
这几条SQL语句中,上面的四条与下面的一条是等效的,但是现在我要把下面的一条改成 hql 的形式,请各位帮忙一下

另外,用后一条语句查询时用
public List findPopular(){
Session session = this.getHibernateTemplate().getSessionFactory().openSession();

log.debug("finding top Popular Goods instances");
try {
String sql = "SELECT * FROM goods g WHERE ID in(SELECT TOP 1 ID FROM goods WHERE g.BTypeID = BTypeID ORDER BY PutTime DESC) ";
Query query = session.createSQLQuery(sql); //执行的是 sql 语句
List list = query.list();
System.out.println(list.size());
return list;
} catch (RuntimeException re) {
log.error("find all failed;查询精品推荐查询出错", re);
throw re;
}
}

可以查询出查到的记录数,但是在却获取不到 good 物品的对象来,也无法输出信息,请问各位是什么原因啊
这里关键是在sql语句,如果可以改成hql语句,问题应该就简单化了

sql="From Goods a where a.id in ( select min(id) from goods group by BTypeID)"

这个是HQL,试一下

select 1 BTypeID ,* from goods group by BTypeID

必须知道你的主键是哪个字段,不然有点难

select distinct * from (
select top 1 * from goods a where a.BTypeID in (

select BTypeID from goods group by BTypeID)

)b

我没有数据库,我这边是ORACLE的,不知道你的数据库支不支持distinct,语法上对不对,你试一下吧

[quote]select distinct * from (
select top 1 * from goods a where a.BTypeID in (

select BTypeID from goods group by BTypeID)

)b
[/quote]这样好像只会查出一条数据来,无法把所有的BTypeID都查出来,真的挺难的啊

select * from goods a where a.主键 in (

select max(主键) from goods group by BTypeID)

如果没有主键,这就是最笨的了
select top 1 * from goods where BTypeID =1
union all
select top 1 * from goods where BTypeID =2
union all
select top 1 * from goods where BTypeID =3
union all
select top 1 * from goods where BTypeID =4

Hibernate 为了能兼容各类DBMS数据库,所以不允许使用top之类的某个数据库专用的语句
另外说明一下,HQL只能使用通用的语句

建议你还是在GOODS这表上加个主键控制吧,这样的话就简单了:
select * from Goods a where a.主键 in (

select max(主键) from Goods group by BTypeID)

另外这个估计有可能会给你参考一下,利用HIBERNATE的分页思想,实现也不错吧:

Query query=session.createQuery(sql);

query.setFirstResult(0); //设置首行记录
//query.setMaxResults(10);//设置查询到的最大记录树数
query.setFetchSize() //设置要查询的记录数

有点类似于TOP

你用SQL的查询,返回的只是一个记录LIST,HIBERNATE并没有封装成对象的LIST,所以你要重新循环封装一下,像JDBC的操作一样。
如果TOP的效果不好实现,建议:
一,你就用SQL去实现,然后重新封装 BO LIST(跟JDBC的操作一样)
二,HQL将结果查出来,在JAVA中循环过滤你想要的数据,这个方法,就是代码多点,笨点就是了。开发过程中复杂的业务逻辑,一个SQL不能实现,也只能这样了。

刚查了一下,用这种可以生成对象:
Query query = session.createSQLQuery(sql).addEntity(XXXXXXX.class);

XXXXXXX 代表以hibernate生成的Bean的对象,也就是 数据表映射出的Bean。

不晓得该怎么回答!?
来看看!

朋友,问题要自动关闭啦,结分哦