1

SQLite 在处理聚合时的行为与许多其他 RDBMS 不同。考虑下表和值:

create table foo (a int, b int);
insert into foo (a, b) values (1, 10);
insert into foo (a, b) values (2, 11);
insert into foo (a, b) values (3, 12);

如果我这样查询:

select a, group_concat(b) from foo;

通常,我希望收到一个错误,因为我没有在 GROUP BY 子句中包含列“a”。下面是 SQL Server 产生的错误(PostgreSQL 会发出类似的东西)。

Column 'foo.a' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

另一方面,SQLite 只是配合它并产生以下结果:

3|10,11,12

这有什么好处?它是如何选择列“a”的值的?如果我们添加另一行,它正在选择的内容似乎有一个模式,也许我们可以试探性地说它正在使用最近添加的行,尽管它可能只是不确定的。

sqlite> insert into foo (a, b) values (2, 13);
sqlite> select a, group_concat(b) from foo;
2|10,11,12,13

这对我来说似乎是一个错误,但我想知道我们这里的数据库专家对此有何看法。

(我在 Ubuntu 上使用 SQLite 版本 3.6.16。)

4

2 回答 2

1

在您选择多个分组列但您只需要查询引擎来真正测试分组的一列的情况下,这是有用的行为。以此为例:

给定一个 Orders 和 OrderDetails 表。

SELECT O.OrderID, O.OrderDate, SUM(OD.Price * OD.Quantity) TotalPrice
FROM Orders O NATURAL JOIN OrderDetails OD
GROUP BY O.OrderID

在其他数据库中,我们需要在 group by 中同时包含 OrderID 和 OrderDate。然后数据库将按两列分组,在这种情况下这是多余的。通过仅对 OrderID 进行分组,我们可以以更高的效率和更少的代码获得相同的结果。

于 2010-01-22T22:57:19.203 回答
0

MySQL 还从匹配的行中返回一个不确定的值a,通常是第一个。SQL Server 和 PostgreSQL 只是通过强制您做出消除每列歧义的决定来防止懒惰。

于 2010-01-22T23:17:51.993 回答