是否可以选择比表中包含的更多行?

时间:2013-08-28 08:14:11

标签: sql sqlite

我有一个包含100行的表。我想从中选择200个项目,使用随机行生成的结果比表中包含以下行的结果更多:

SELECT * FROM `rows` ORDER BY RANDOM() LIMIT 200;

此查询可预测地返回100个结果。有没有办法随机选择多于表中实际包含的内容?

修改

有没有办法在不添加复合join语句的情况下选择任意数量的记录?例如,如果项目的请求数量(LIMIT)提前未知或任意大,该怎么办?

4 个答案:

答案 0 :(得分:4)

尝试这样的事情

SELECT *
FROM `rows`
    cross join `rows`
ORDER BY RANDOM()
LIMIT 200;

答案 1 :(得分:0)

一个选项:

Select * From (
SELECT * FROM `rows`
UNION ALL
SELECT * FROM `rows`
) as alotofrows
ORDER BY RANDOM()
LIMIT 200;

答案 2 :(得分:0)

您应该可以执行以下操作:

select * from rows
union all
select * from rows
order by random()
limit 200

请注意,如果您可以保证表格包含100行,则实际上不需要200限制。

union all为您提供了两份副本(没有重复删除),然后order by随机为您提供完整的数据集。

当然,如果你的表包含100,并且你想要更多而不是200,那么你需要处理更多的联合条款。

但是,您可能会发现简单地(更灵活)选择100行,将它们全部放入内存中结构,然后使用代码选择所需的行而不是SQL。

这样可以让你精确控制选择过程,当然比我们为你写的任何“SQL体操”都要好: - )

答案 3 :(得分:0)

我的方法不符合“任意大”的要求,但很容易扩展。

第一个问题是生成N行。在SQLite中我使用了视图。您也可以考虑使用虚拟表。

CREATE VIEW V10 AS SELECT 0 AS Number UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9;
CREATE VIEW V100 AS SELECT V10.Number*10+low.Number AS Number FROM V10 JOIN V10 AS low;
CREATE VIEW V10000 AS SELECT V100.Number*100+low.Number AS Number FROM V100 JOIN V100 AS low;

查询V10000将从0到9999返回Number

现在你可以:

SELECT table.* FROM table JOIN (
    SELECT (
        SELECT ROWID+Number*0 AS rndid FROM table ORDER BY RANDOM()
    ) FROM V10000 WHERE Number<200
) ON table.ROWID=rndid;

它是如何运作的?

  1. 大多数内部SELECTtable中选择一个随机行并返回其ROWID,名为rndid;
  2. 中级SELECT乘以随机行;
  3. SELECT匹配整个table行并返回rndid
  4. 如果需要超过10000个结果,则可以创建另一个更宽的VIEW作为之前的结果。

    脚注:这是一个纯SQL(迭代)算法。使用某种编程语言,使用重复的TEMP TABLESELECT * FROM来创建ORDER BY RANDOM() LIMIT 1;可能是最有效的