【发布时间】:2019-03-25 02:12:13
【问题描述】:
我对我的数据库 (SQLite 3.21.0) 进行了一些测试,我的解决方案似乎有效,但我担心这只是运气,在某些情况下可能会失败,我想知道我的解决方案是否有效...
似乎GROUP_CONCAT() 使用主键或者如果没有主键,它会尝试查找数字列并将其用于连接顺序,所以我想检查我的理论并决定使用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
WITH data 将具有第一列作为 cID 的表,每行将是 98,它将用于连接,GROUP_CONCAT 也必须使用它,因为它的只有数字列,ORDER BY 将设置我需要的行顺序
现在主查询将在这个新表 (data) 上执行 GROUP_CONCAT,并且因为 data.cID 对于每一行都是相同的,所以它会将它连接起来
为了比较,这里是有顺序问题的常规查询:
SELECT cID, GROUP_CONCAT(pType || ':' || pID || ':' || pTotal || ':' ||
(CASE WHEN pDate IS NULL OR pDate = '' THEN '0' ELSE pDate END), '|') fees
FROM Pay2015 AS A WHERE cID = 98 AND pType > 1 ORDER BY pType
这是按 pType 排序时的结果:(为了简单起见,我使用 | 进行拆分,删除了除 pType 之外的所有列)
可以看到,结果顺序和常规查询中的pID顺序是一样的
你怎么看?
【问题讨论】:
-
来自
group_concat()的文档:“连接元素的顺序是任意的。”
标签: sqlite