求一个SQL语句

cannycsy 2009-02-27 08:20:06
求一个SQL语句

首先看个例子:
table
字段一,字段二
a,1
a,3
b,2
b,4
要查询字段一,以字段二排序显示,这个需求和上编文章一直;先分析一下,如果a取第一条记录,b也取第一条记录
那么排序显示就应该是:
a
b
但是如果a取第二条记录,b还是取第一条记录,那么排序就变成如下:
b
a
在sql中a取第一条还是第二条应该是一个随机选择,也就是说这个排序显示是不确定的,并不能得到某个固定的排序显示。

...全文
122 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
百年树人 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 liangCK 的回复:]
引用 7 楼 josy 的回复:
引用 6 楼 cannycsy 的回复:
我的意思是分别随机取得表中有重复记录中的一条再显示出来.

table
字段一,字段二
a,1
a,3
b,2
b,4

字段一是有重复的,如重复的有a和b,那么重复字段a的对应有1和3,用SQL随机取出一个,可以取1,也可以取3,同理,重复字段b也随机取出一个,如还有很多重复的都是这样随机取一个再显示出来.



SQL codeselect *
from
(
select top…
[/Quote]

cannycsy 2009-02-27
  • 打赏
  • 举报
回复
非常感谢谢楼上的,可以了.
liangCK 2009-02-27
  • 打赏
  • 举报
回复
--创建表并插入数据:
create table tb(name varchar(10),val int,memo varchar(20))
insert into tb values('a', 2, 'a2(a的第二个值)')
insert into tb values('a', 1, 'a1--a的第一个值')
insert into tb values('a', 3, 'a3:a的第三个值')
insert into tb values('b', 1, 'b1--b的第一个值')
insert into tb values('b', 3, 'b3:b的第三个值')
insert into tb values('b', 2, 'b2b2b2b2')
insert into tb values('b', 4, 'b4b4')
insert into tb values('b', 5, 'b5b5b5b5b5')
go

--四、按name分组随机取一条数据。
select a.* from tb a where val = (select top 1 val from tb where name = a.name order by newid()) order by a.name

DROP TABLE tb
cannycsy 2009-02-27
  • 打赏
  • 举报
回复
恩,8楼的在SQL2005可以通过,但是sql2000呢?继续求解中....
liangCK 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 cannycsy 的回复:]
楼上的如何做到相同的a或者b只取一条数据呢?


SQL code
少了表名
select *
from tb
ordr by 字段1,newid()
[/Quote]

如果是SQL Server 2005的。请看8楼。
cannycsy 2009-02-27
  • 打赏
  • 举报
回复
楼上的如何做到相同的a或者b只取一条数据呢?


少了表名
select *
from tb
ordr by 字段1,newid()

Andy__Huang 2009-02-27
  • 打赏
  • 举报
回复
少了表名
select *
from tb
ordrby 字段1,newid()
Andy__Huang 2009-02-27
  • 打赏
  • 举报
回复
select person_no,person_name ,position_no
from person
order by position_no, newid()
我刚验证过,这个语句相同position_no,前面内容可以随机排序;

所以你的语句应该这样写
select * from
ordrby col1,newid()

liangCK 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 josy 的回复:]
引用 6 楼 cannycsy 的回复:
我的意思是分别随机取得表中有重复记录中的一条再显示出来.

table
字段一,字段二
a,1
a,3
b,2
b,4

字段一是有重复的,如重复的有a和b,那么重复字段a的对应有1和3,用SQL随机取出一个,可以取1,也可以取3,同理,重复字段b也随机取出一个,如还有很多重复的都是这样随机取一个再显示出来.



SQL codeselect *
from
(
select top 1 * from [table] where [字…
[/Quote]

如果不止a,b,而有10000个不同的.你要写10000个UNION ALL??
liangCK 2009-02-27
  • 打赏
  • 举报
回复
---------------------------------
-- Author: liangCK 小梁
---------------------------------

--> 生成测试数据: @table
DECLARE @table TABLE (字段一 VARCHAR(1),字段二 INT)
INSERT INTO @table
SELECT 'a',1 UNION ALL
SELECT 'a',3 UNION ALL
SELECT 'b',2 UNION ALL
SELECT 'b',4

--SQL查询如下:

;WITH Liang AS
(
SELECT *,gid=ROW_NUMBER() OVER(PARTITION BY 字段一 ORDER BY NEWID())
FROM @table
)
SELECT
字段一,字段二
FROM Liang
WHERE gid=1
ORDER BY 字段二

/*
字段一 字段二
---- -----------
b 2
a 3

(2 行受影响)

*/
百年树人 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cannycsy 的回复:]
我的意思是分别随机取得表中有重复记录中的一条再显示出来.

table
字段一,字段二
a,1
a,3
b,2
b,4

字段一是有重复的,如重复的有a和b,那么重复字段a的对应有1和3,用SQL随机取出一个,可以取1,也可以取3,同理,重复字段b也随机取出一个,如还有很多重复的都是这样随机取一个再显示出来.
[/Quote]

select *
from
(
select top 1 * from [table] where [字段一]='a' order by newid()
union all
select top 1 * from [table] where [字段一]='b' order by newid()
) t
order by [字段二]

这样?
cannycsy 2009-02-27
  • 打赏
  • 举报
回复
我的意思是分别随机取得表中有重复记录中的一条再显示出来.

table
字段一,字段二
a,1
a,3
b,2
b,4

字段一是有重复的,如重复的有a和b,那么重复字段a的对应有1和3,用SQL随机取出一个,可以取1,也可以取3,同理,重复字段b也随机取出一个,如还有很多重复的都是这样随机取一个再显示出来.
htl258_Tony 2009-02-27
  • 打赏
  • 举报
回复
帮顶
liangCK 2009-02-27
  • 打赏
  • 举报
回复
增加一个分组标识列

table
字段一,字段二 分组标识
a, 1 1
a, 3 2
b, 2 1
b, 4 2

然后再排..


;WITH Liang AS
(
SELECT
gid=ROW_NUMBER() OVER(PARTITION BY 字段一 ORDER BY 字段二),
*
FROM tb
)
SELECT 字段一,字段二
FROM Liang
WHERE ....
ORDER BY gid,字段二
Andy__Huang 2009-02-27
  • 打赏
  • 举报
回复
这个我觉得写一个存储过程好一些,先判断这个随机数,由这个随机数判断到底是a排在前面还是a排在后面?
百年树人 2009-02-27
  • 打赏
  • 举报
回复
不是很明白楼主的意思,猜的

select top 1 * from [table] where [字段一]='a' order by [字段二]
union all
select top 1 * from [table] where [字段一]='b' order by newid()
Andy__Huang 2009-02-27
  • 打赏
  • 举报
回复
不是按字段二的值排序吧?那么

a取第一条
select * from tb where ..... order by case when col1='a' then 0 else 1 end

a取第二条
select * from tb where ..... order by case when col1='b' then 0 else 1 end

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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