Будет ли SQLite GROUP_CONCAT () работать по порядку? - PullRequest
0 голосов
/ 20 октября 2018

Я провел несколько тестов на моей базе данных ( 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 установит порядок строк, который мне нужен

Теперь основной запрос выполнит GROUP_CONCAT для этой новой таблицы ( data)) и потому что 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 - первичный ключ)
enter image description here

И это результаты при заказе по pType: (я использую | , чтобы разделить, удалить всестолбцы, но pType для простоты)
enter image description here
Как видите, порядок результатов такой же, как порядок pID в обычном запросе

Что выдумаю

1 Ответ

0 голосов
/ 21 октября 2018

Реализация group_concat() обрабатывает строки в любом порядке, в котором происходит их чтение базой данных.

Единственный способ обеспечить порядок - это прочитать строки из подзапроса (или представления, или CTE)фактически имеет указанный порядок:

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

Обратите внимание, что этот подзапрос должен быть единственным источником данных в предложении FROM;если вы объединяете его с любой другой таблицей, соединение может привести к тому, что база данных будет читать строки в каком-то другом порядке.Если вам нужно присоединиться, вы должны сделать это внутри подзапроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...