SQL Server选择随机AND而不是随机

时间:2011-11-09 20:33:46

标签: sql-server random nested

我有一张桌子,我想随机选择10行。但我还需要选择“销售”中的任何行。我只想要10行,可能有2个销售行可能有9个,我需要用随机行填充剩余的行。我需要一个查询。

SELECT TOP 10 BookTitle, BookAuthor, BookCategory
FROM TheTable
ORDER BY newid()

SELECT TOP 10 BookTitle, BookAuthor, BookCategory
FROM TheTable
WHERE BookCategory LIKE 'Sale%' 

我一直在罢工,我可能在思考这个......

感谢。

4 个答案:

答案 0 :(得分:4)

对于大型桌子来说效率不高但是......

SELECT TOP 10 BookTitle,
              BookAuthor,
              BookCategory
FROM   TheTable
ORDER  BY CASE
            WHEN BookCategory LIKE 'Sale%' THEN 0
            ELSE 1
          END,
          newid()  

如果你的桌子很大,你应该做2次查询。一个是获得销售商品,然后第二个是在需要时获得“充值”随机非销售商品的数量。

答案 1 :(得分:4)

按类别选择10,在子查询中选择10个随机 按类别划分优先顺序。

SELECT TOP 10 BookTitle, BookAuthor, BookCategory
FROM (
    SELECT TOP 10 BookTitle, BookAuthor, BookCategory, 0 as prio
    FROM TheTable
    WHERE BookCategory LIKE 'Sale%')

    UNION ALL 
    SELECT TOP 10 BookTitle, BookAuthor, BookCategory, 1 As prio
    FROM TheTable
    TABLESAMPLE (50 ROWS)
    ) x
ORDER BY prio

我从@ Remus的回答中得到了TABLESAMPLE,因为对于大表来说这显然要快得多。如果这是你的主要特色,请投票给他。

然而,我调整了TABLESAMPLE (50 ROWS),因为warning in the manual

  

返回的实际行数可能会有很大差异。如果   如果指定了一个较小的数字,例如5,则可能无法收到结果   在样本中。

我刚测试并复制了这个。我另外离开TOP 10因为我们最后只需要最多10个。

此外,“随机性”上的manual adds a disclamer

  

如果您真的想要随机抽取单个行,请修改您的   查询以随机过滤行,而不是使用TABLESAMPLE。

因此,如果真正的随机选择是必需的,那么您的原始newid()是正确的方法。

答案 2 :(得分:2)

使用TABLESAMPLE。使用ORDER BY NEWID()的天真方法将导致可怕的性能,因为必须为每个查询扫描和排序整个表,只需选择10个随机行。内置的TABLESAMPLE语法将使用高效的IO页面采样提供所需的行数,并且样本随机性足以满足日常使用。有关详细信息,请参阅Limiting Result Sets by Using TABLESAMPLE

select top(10) BookTitle, BookAuthor, BookCategory 
from (
   SELECT TOP(10) BookTitle, BookAuthor, BookCategory
   FROM TheTable
   WHERE BookCategory LIKE 'Sale%'
   UNION ALL 
   SELECT BookTitle, BookAuthor, BookCategory
   FROM TheTable TABLESAMPLE (10 ROWS)) as theUnion;

请注意,这并不能保证任何“随机”行不是“Sale%”行之一,从而产生重复的行。如果您需要这样的排除,则可能会更复杂且可能效率低下。

答案 3 :(得分:0)

组合两个查询有什么问题吗?

SELECT TOP 10 BookTitle, BookAuthor, BookCategory
FROM TheTable
ORDER BY newid()
WHERE BookCategory LIKE 'Sale%'