我有一张桌子,我想随机选择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%'
我一直在罢工,我可能在思考这个......
感谢。
答案 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%'