我已经注意到,使用“ GROUP BY”处理SQLite更高版本的结果的顺序存在问题。我第一次注意到Android 11时使用SQLite 3.28.0的情况。我现在将其固定为SQLite本身的行为更改。问题是结果的顺序因版本而异。我不确定这是错误,预期的行为还是我自己的错误(尽管该错误在较旧的SQLite版本中已经可以使用8年了)。
表格示例:
id|year|command |code
1 |2005|TV |A
2 |2005|TV-CD |B
3 |2005|CD |B
4 |2010|TV |B
5 |2015|TV |C
如果我运行以下命令
SELECT * FROM myTable GROUP BY command ORDER BY _id
在SQLite 3.22(Android 10)或3.23.1中,我得到:
2|2005|TV-CD|B
3|2005|CD |B
5|2015|TV |C
我要的是...
如果我在SQLite 3.28(Android 11)或更高版本中运行相同的命令,则会得到
1|2005|TV |A
2|2005|TV-CD|B
3|2005|CD |B
如果您想自己尝试一下,这是表格的快速示例
CREATE TABLE 'myTable' ('_id' integer PRIMARY KEY ,'year' NUMERIC ,'command' TEXT, 'code' TEXT);
INSERT INTO myTable VALUES ("1","2005","TV","A");
INSERT INTO myTable VALUES ("2","2005","TV-CD","B");
INSERT INTO myTable VALUES ("3","2005","CD","B");
INSERT INTO myTable VALUES ("4","2010","TV","B");
INSERT INTO myTable VALUES ("5","2015","TV","C");
SELECT * FROM myTable GROUP BY command ORDER BY _id
https://www.jdoodle.com/execute-sql-online/对于测试非常有用,因为它允许您即时更改SQLite版本。
正如我在评论中已经提到的,查询的结果如下:
SELECT * FROM myTable GROUP BY command
是不可预测的,因为GROUP BY
仅应用于聚合,例如:
SELECT command, MAX(year) AS max_year
FROM myTable
GROUP BY command
这将返回year
每个的最大值command
。
因此,如果在新版本中GROUP BY
with的行为SELECT * ...
已更改,那么如果您不使用此类查询就不会有问题。
根据我在您的问题中所读的内容,您期望command
具有max的每一行的结果id
。
在标准sql和没有窗口功能的情况下(大多数android SQLite的大多数版本仍不支持该功能),您可以先进行汇总,然后再加入表中。
但是,SQLite具有使用的已记录功能,因此您可以使用裸列。
这是有效的:
SELECT MAX(_id) AS _id, year, command, code
FROM myTable
GROUP BY command
ORDER BY _id
您将得到最大的行_id
每个command
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句