sql >> Databáze >  >> RDS >> Sqlserver

Vrácení více řádků z jednoho řádku

zkuste toto:

create table #smalltable (id int, [begin] int, [end] int)
insert into #smalltable values (123,1,4)
insert into #smalltable values (124,1,12)
insert into #smalltable values (125,1,7)

;WITH digits (d) AS (
    SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION
    SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION
    SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION
    SELECT 0)
SELECT
    s.id, s.[begin], n.Number AS [End]
    FROM (SELECT i.d + ii.d * 10 + iii.d * 100 + iv.d * 1000 +
              v.d * 10000 + vi.d * 100000 AS Number
              FROM digits            i
                  CROSS JOIN digits  ii
                  CROSS JOIN digits  iii
                  CROSS JOIN digits  iv
                  CROSS JOIN digits  v
                  CROSS JOIN digits  vi
         ) AS N
        INNER JOIN #smalltable                                    s  ON 1=1
        INNER JOIN (SELECT MAX([end]) AS MaxEnd FROM #smalltable) dt ON 1=1
   WHERE n.Number > 0 AND n.Number<=dt.MaxEnd
    AND n.Number<=s.[end]
   ORDER BY s.id,n.Number

komentáře

  • Nepojmenujte své sloupce vyhrazenými slovy:„začátek“ a „konec“, jednou mi poděkujete.
  • pokud to plánujete spustit v produkci mnohokrát, vytvořte tabulka čísel
    a místo toho použijte tento dotaz:

než to bude fungovat, musíte mít tabulku Numbers (viz odkaz výše)

SELECT
    s.id,s.[begin],n.Number AS [End]
    FROM Numbers                n
        INNER JOIN #smalltable  s ON 1=1
   WHERE  n.Number > 0 AND n.Number<=s.[end]
   ORDER BY s.id,number

poběží to lépe.



  1. Proč NVL vždy vyhodnocuje 2. parametr

  2. Jak zobrazit ukazatel průběhu při provádění velkého SQLCommand VB.Net

  3. SQLCLR a DateTime2

  4. Zkontrolujte, zda pole Postgres JSON obsahuje řetězec