【问题标题】:Will this SQLite GROUP_CONCAT() order by work?这个 SQLite GROUP_CONCAT() 会按工作排序吗?
【发布时间】: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

Pay2015 表数据:(pID 为主键)

这是按 pType 排序时的结果:(为了简单起见,我使用 | 进行拆分,删​​除了除 pType 之外的所有列)
可以看到,结果顺序和常规查询中的pID顺序是一样的

你怎么看?

【问题讨论】:

标签: sqlite


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2010-12-26
    • 2013-07-24
    • 2016-02-14
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    相关资源
    最近更新 更多