Autor Zpráva
ninja
Profil
V první tabulce mám dva sloupce s datumem (from, till) a další údaje. Opakovaně musím přenášet data do jiné tabulky, kde se ukladá na každý řádek jeden den z daného rozsahu (insert/update). Jak na tuto úlohu co nejlépe, ideálně bez přenosu dat do aplikace a zpět?

Příklad:
tabulka 1
ID FROM       TILL       DATA
1  2012-01-04 2012-01-06 XXX
2  2012-01-06 2012-01-07 ZZZ

tabulka 2
DATE       DATA
2012-01-04 XXX
2012-01-05 XXX
2012-01-06 XXXZZZ
2012-01 07 ZZZ

Aktuálně to jede na MySQL 5, ve finále na Google BigQuery, tedy čím jednoduší a nepropriatární SQL příkazy tím lépe.
Kajman
Profil
Pomohla by pomocná tabulka s kalendářem. Tedy mít další přednachystanou tabulku (pro jiné aplikace se může hodit označení svátku atp.), kde budou všechny potřebné dny. Pak se jednoduchým joinem dají zjistit data pro tabulku 2.
ninja
Profil
Ano. V současnosti používám tuto šílenost, kde se to generuje on-the-fly:

SELECT a.date, tabulka.profile_id, tabulka.data  
FROM tabulka LEFT JOIN (
    select '2012-01-01' + INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as date from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c) a ON a.date BETWEEN tabulka.startdate AND tabulka.enddate GROUP BY a.date, tabulka.id

Rychlost dotazu samozřejmě nejvíce závisí na počtu data v tabulka (v reálu doatazuji jen jejich část). Je zajímavé, že tabulku váži na a přes JOIN a ne LEFT JOIN, dotaz trvá řádově déle, rptože musí pocházet celou tabulku a dělá Range search...
Kajman
Profil
Myslím, že s pomocnou kalendářovou tabulkou to bude rychlejší, tam to nemusí nic počítat a může využít indexy. A výsledný sql bude určitě jednotnější napříč databázemi.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: