【发布时间】:2022-01-09 06:06:23
【问题描述】:
假设我在 SQLite 中运行以下命令:
CREATE TABLE my_table
(
id INTEGER PRIMARY KEY,
NAME VARCHAR(20),
date DATE,
num INTEGER,
important VARCHAR(20)
);
INSERT INTO my_table (NAME, date, num, important)
VALUES ('A', '2000-01-01', 10, 'Important 1');
INSERT INTO my_table (NAME, date, num, important)
VALUES ('A', '2000-02-01', 20, 'Important 2');
INSERT INTO my_table (NAME, date, num, important)
VALUES ('A', '1999-12-01', 30, 'Important 3');
表格如下所示:
| id | NAME | date | num | important |
|---|---|---|---|---|
| 1 | A | 2000-01-01 | 10 | Important 1 |
| 2 | A | 2000-02-01 | 20 | Important 2 |
| 3 | A | 1999-12-01 | 30 | Important 3 |
如果我执行:
SELECT id
FROM my_table
GROUP BY NAME;
结果是:
+----+
| id |
+----+
| 1 |
+----+
如果我执行:
SELECT id, MAX(date)
FROM my_table
GROUP BY NAME;
结果是:
+----+------------+
| id | max(date) |
+----+------------+
| 2 | 2000-02-01 |
+----+------------+
如果我执行:
SELECT id,
MAX(date),
MAX(num)
FROM my_table
GROUP BY NAME;
结果是:
+----+------------+----------+
| id | max(date) | max(num) |
+----+------------+----------+
| 3 | 2000-02-01 | 30 |
+----+------------+----------+
我的问题是,这是明确定义的吗?具体来说,我是否保证在进行第二次查询时总是得到id = 2(使用单个Max(date) 聚合),或者这只是SQLite 如何在分组之前订购表以获取Max 的副作用?
我问这个是因为我特别想要id = 2。然后,我将执行另一个查询,为该行选择important 字段(对于我的实际问题,第一个查询将返回多个ids,我将一次为所有这些行选择所有important 字段。
此外,这一切都发生在 iOS 核心数据查询中,因此我无法执行更复杂的子查询。如果我知道 GROUP BY 的顺序是由聚合定义的,那么我会很有信心我的查询不会中断(直到 Apple 不再使用 SQLite for Core Data)。
谢谢!
【问题讨论】:
-
所有这些查询都在 SQLite 中工作(在命令行上)。