这个功能能否用一句sql实现?

Hrunt 2008-02-25 05:41:52
要求是:从表tab中,首先随机选取符合条件a的记录n1个,再随机选取符合条件b的记录n2个...
(设n=n1+n2+...)
以此类推,最后将选出的这n条记录随机排序

谢谢!
...全文
92 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
dobear_0922 2008-02-25
create table tab(a int, b int)

insert tab select 1,1
union all select 2,3
union all select 22,33
union all select 222,333
union all select 2222,3333
union all select 22222,33333

select * from
(
select * from (select top 2 * from tab where a>=2 order by newid()) T
union all
select * from (select top 3 * from tab where a>=33 order by newid()) T
) T
order by newid()

drop table tab

/*
a b
----------- -----------
222 333
22 33
2222 3333
2222 3333
22222 33333

(5 row(s) affected)
*/
回复
Hrunt 2008-02-25
已解决,感谢各位!
回复
Hrunt 2008-02-25
是第二种
但是运行了会报错~
提示:
order by 表达式 (Rnd(id)) 包含当前查询未选定的字段。只有第一次查询所包含的字段才可以包含在order by表达式中

怎么回事?
回复
JL99000 2008-02-25
楼主把问题说明白:你的随即取法可以理解为2种情况
--第一种
先取出n1个后,将剩下的取n2个
做法:
declare @t table(各个字段)
insert into @t select top n1 * from tab where '条件a' order by Rnd(id)
insert into @t select top n2 * from tab where '条件b' and '该记录不在@t中' order by Rnd(id)


--第二种
先取出n1个,在取出n2个,做union all
这样的话会出现相同的记录
select * from
(select top n1 * from tab where '条件a' order by Rnd(id)
union all
select top n2 * from tab where '条件b' order by Rnd(id))a
order by Rnd(id)


回复
zefuzhang2008 2008-02-25
呵呵,都被晃了
回复
Hrunt 2008-02-25
哦,对的,非常感谢!
再补充一下,在access数据库中,没有newid()这个函数,该怎么随机查询呢?
回复
gahade 2008-02-25
这样?

select * from (
select top n1 * from tab where a条件
union all
select top n2 * from tab where b条件)t
order by newid()
回复
liangCK 2008-02-25
他不是问能否吗?答曰:能.
回复
liangCK 2008-02-25
可以
回复
pt1314917 2008-02-25

--这样?

select * from
(select top n1 * from tab where '条件a' order by newid()
union all
select top n2 * from tab where '条件b' order by newid())a
order by newid()
回复
相关推荐
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-02-25 05:41
社区公告
暂无公告