Mysql
 sql >> Database >  >> RDS >> Mysql

Perché questo concat ricorsivo produce:dati troppo lunghi

Molto lontano dalla pagina del manuale di MySQL 8 CTE è un esempio che mostra il problema che stai riscontrando. Fondamentalmente il problema è che i tuoi ids la colonna è troppo stretta per ABC valore che gli viene assegnato quando ottiene la sua larghezza dalla parte non ricorsiva del CTE (che è effettivamente la lunghezza di id cioè 2 caratteri). Puoi risolvere questo problema con un CAST a una larghezza sufficientemente grande da contenere tutti i risultati, ad esempio:

with recursive cte(greatest_id, ids, total) as (
    select     id,
               CAST(id AS CHAR(5)) AS ids, 
               val
    from       tbl
    union all
    select     tbl.id,
               concat(cte.ids, tbl.id),
               cte.total + tbl.val
    from       cte 
    inner join tbl 
            on tbl.id > cte.greatest_id
           and cte.total + tbl.val <= 6
) 
select ids, total from cte

Aggiorna la tua demo