没有重复记录的行

时间:2010-09-03 05:33:17

标签: sql database

id     | name 
-------+------------------------------------- 
209096 | Pharmacy 
204200 | Eyecare Center 
185718 | Duffy PC 
214519 | Shopko 
162225 | Edward Jones 
7609   | Back In Action Chiropractic Center

我使用select id, name from customer order by random()

我只想要6条记录,当我查询时,我将每次获得一次唯一的行六次,然后从第一次开始再次开始,或者每次最重要的一次都没有重复记录/ p>

3 个答案:

答案 0 :(得分:0)

每次会给你6个随机行。如果您的id不是唯一的主键,则Group By将确保唯一的行,因此可能不需要 - 具体取决于您的表结构。

SELECT TOP 6 id, name, ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) AS [RandomNumber]
FROM customer
GROUP BY id,name
ORDER BY [RandomNumber]

修改:抱歉!没有正确地阅读这个问题。虽然每次都可以使用它来获取随机行:)

如果您希望一次以1个随机顺序获取所有6行,则需要在某处存储订单。建议创建临时表并从那里进行选择,或者如果使用前端网页,则获取所有6行并存储在数据集中。

答案 1 :(得分:0)

你可以使用那个逻辑, “milisecond”当前日期的一部分总是在变化。我们有一个id列作为数字。因此我们可以使用模块化函数来获得随机顺序:

create table #data(id numeric(10), name varchar(20))
insert #data select 209096 , 'Pharmacy'
insert #data select 204200 , 'Eyecare Center'
insert #data select 185718 , 'Duffy PC'
insert #data select 214519 , 'Shopko'
insert #data select 162225 , 'Edward Jones'
insert #data select 7609   , 'Back In Action Chiropractic Center'

select * from #data order by id % (datepart(ms, getdate()))

答案 2 :(得分:0)

好吧也许在SQL中还有另一种方法可以做到这一点。添加一个新的BIT列“selected”。绝对不是最快/最好的表现方式。

DECLARE @id INT
IF NOT EXISTS (SELECT TOP 1 id FROM customer WHERE selected = 0)
BEGIN
   UPDATE customer SET selected = 0
END

SELECT @id = id FROM
(SELECT TOP 1 id, ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) AS [RandomNumber]
FROM customer WHERE selected = 0
ORDER BY [RandomNumber]) a

UPDATE customer SET selected = 1 WHERE id = @id
SELECT id, name FROM customer WHERE id = @id