此SQLite GROUP_CONCAT()会按工作顺序吗?

时间:2018-10-20 11:11:24

标签: sqlite

我在数据库( SQLite 3.21.0 )上做了一些测试,看来我的解决方案有效,但是我担心它只是运气,在某些情况下可能会失败,我想知道我的解决方案是否有效...

似乎GROUP_CONCAT()使用主键,或者如果没有主键,它将尝试查找数字列并将其用于串联顺序,因此我想检查一下理论并决定使用{{ 1}}子句生成“新”表,这样,我将设置WITH必须使用的顺序

这是我的工作:(简化查询)

GROUP_CONCAT

WITH data AS (SELECT cID, pType || ':' || pID || ':' || pTotal || ':' || (CASE WHEN pDate IS NULL OR pDate = '' THEN '0' ELSE pDate END) fees FROM Pay2015 AS A WHERE cID = A.cID AND pType > 1 ORDER BY pType) SELECT A.cID, GROUP_CONCAT(data.fees, '|') fees FROM Pay2015 AS A LEFT OUTER JOIN data ON A.cID = data.cID WHERE A.cID = 98 AND pType = 0 数据将具有第一列的表作为cID,每行将是98,它将用于连接,WITH也将必须使用因为它是唯一的数字列,而GROUP_CONCAT会设置我需要的行顺序

现在,主查询将在此新表( data )上执行ORDER BY,并且由于 data.cID 对于每一行都是相同的,它将对其进行连接就这样

为了进行比较,这里是有顺序问题的常规查询:

GROUP_CONCAT

Pay2015 表数据:(pID是主键)
enter image description here

这是按pType排序时的结果:(为简单起见,我使用 | 进行了分割,删除了除pType之外的所有列)
enter image description here
如您所见,结果顺序与常规查询中的pID顺序相同

你怎么看?

1 个答案:

答案 0 :(得分:0)

group_concat()的实现以数据库碰巧读取行的任何顺序处理行。

执行顺序的唯一方法是从实际上具有指定顺序的子查询(或视图或CTE)中读取行:

SELECT ... group_concat(...) ... FROM (SELECT ... ORDER BY ...);

请注意,子查询必须是FROM子句中唯一的数据源。如果将其与任何其他表连接,则该连接可能导致数据库以其他顺序读取行。如果需要加入,则必须在子查询中完成。