给定此表:
# select * from messages;
| 冗长| verbosity |
| - -----| ------------ |
| 二十个| 20 |
| 二十个| 20 |
| 二十个| 20 |
| 三十| 30 |
| 一百| 100 |
(5行)我想选择verbosity
的总和小于N的N条消息。因此,如果N = 70
,所需的结果将是id为1、2和3的消息。解决方案独立于数据库是很重要的。它至少应该在PostgreSQL和SQLite上工作。
类似于:
SELECT * FROM messages GROUP BY id HAVING SUM(verbosity) < 70;
不会对verbosity
列中的所有值求和。
2条答案
按热度按时间8oomwypt1#
这里假设
id
是一个唯一的升序,就像您在示例中看到的那样。在现代Postgres中-或者通常使用现代标准SQL(但在SQLite中 * 不是 *):
简单CTE
递归CTE
对于只检索一个小集合的大表应该更快。
所有标准SQL,**
LIMIT
**除外。严格地说,没有“数据库独立”这样的东西。有各种SQL标准,但没有RDBMS完全遵守。
LIMIT
适用于PostgreSQL和SQLite(以及其他一些)。对SQL Server使用TOP 1
,对Oracle使用rownum
。这是维基百科上的一个完整列表。SQL:2008标准是:
... PostgreSQL支持-但几乎没有任何其他RDBMS。
适用于更多系统的纯替代方案是将其 Package 在子查询中并
但这是缓慢和笨拙的。
老麻雀
jv2fixgn2#
这会有用的。。
但是,您应该了解SQL是设计为基于集合的语言,而不是迭代语言,因此它设计为将数据视为一个集合,而不是逐行处理。