sql >> Database >  >> RDS >> Mysql

Waarom deze recursieve concat produceert:Gegevens te lang

Een heel eind op de MySQL 8 CTE handmatige pagina is een voorbeeld dat het probleem laat zien dat u ondervindt. Het probleem is eigenlijk dat uw ids kolom is te smal voor het ABC waarde die eraan wordt toegewezen omdat het zijn breedte krijgt van het niet-recursieve deel van de CTE (wat in feite de lengte is van id d.w.z. 2 tekens). Je kunt dat probleem oplossen met een CAST tot een breedte die groot genoeg is om in alle resultaten te passen, bijvoorbeeld:

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

Update van uw demo




  1. SQL:de doeltabel gebruiken in een UPDATE-instructie in een geneste FROM-component

  2. Converteer 'datetime' naar 'time' in SQL Server (T-SQL-voorbeelden)

  3. Blokkeren, blokkeren, blokkeren op DBA's-deur met SQL Server-blokkering

  4. subselect sql-query werkt niet op mysql 4.