Hirdetés

Keresés

Új hozzászólás Aktív témák

  • nyunyu

    félisten

    válasz Taci #5317 üzenetére

    Ja, hogy egységesíteni akarod a cikk_kategoria összerendeléseket?

    Akkor
    1) öntsd bele egy közös táblába az összes eddigi kategórianevedet (legyen kategoria_uj a példa kedvéért)

    2) csinálj egy cikk_kategoria_uj táblát, amiben már nincs kategoria_verzio oszlop, többi ugyanaz, mint az eddigi cikk_kategoria-nal.

    3) töltsd fel tömegesen a cikk_kategoria_uj táblát:
    merge into cikk_kategoria_uj i
    using (
    select a.cikk_id,
    a.cim,
    a.kategoria_nev
    a.kategoria_verzio,
    a.kategoria_id kategoria_id_regi
    k.kategoria_id kategoria_id_uj
    from (
    select c.id cikk_id,
    c.cim,
    ck.kategoria_id,
    ck.kategoria_verzio,
    case
    when ck.kategoria_verzio = 1 then k1.nev
    when ck.kategoria_verzio = 2 then k2.nev
    when ck.kategoria_verzio = 3 then k3.nev
    end kategoria_nev
    from cikkek c
    join cikk_kategoria ck
    on ck.cikk_id = c.id
    left join kategoria_v1 k1
    on k1.id = ck.kategoria_id
    left join kategoria_v2 k2
    on k2.id = ck.kategoria_id
    left join kategoria_v3 k3
    on k3.id = ck.kategoria_id) a
    join kategoria_uj k
    on k.kategoria_nev = a.kategoria_nev) x
    on (i.cikk_id = x.cikk_id and i.kategoria_id = x.kategoria_id_uj)
    when not matched
    then insert (cikk_id, kategoria_id)
    values (x.cikk_id, x.kategoria_id_uj);

    4) ELLENŐRIZD az új táblákat:
    select c.id,
    c.cim,
    ck.kategoria_id,
    case
    when ck.kategoria_verzio = 1 then k1.nev
    when ck.kategoria_verzio = 2 then k2.nev
    when ck.kategoria_verzio = 3 then k3.nev
    end kategoria_nev
    from cikkek c
    join cikk_kategoria ck
    on ck.cikk_id = c.id
    left join kategoria_v1 k1
    on k1.id = ck.kategoria_id
    left join kategoria_v2 k2
    on k2.id = ck.kategoria_id
    left join kategoria_v3 k3
    on k3.id = ck.kategoria_id;

    vs
    select c.cid,
    c.cim,
    ck.kategoria_id,
    k.nev kategoria_nev
    from cikkek c
    join cikk_kategoria_uj ck
    on ck.cikk_id = c.id
    join kategoria_uj k
    on k.id = ck.kategoria_id;

    5) ha egyeznek, akkor átnevezed a régi táblákat valami másra.
    ha nem, akkor átgondolod, mit szúrtál el/mi maradt ki.

    6) új táblákat átrakod a régiek helyére:
    rename cikk_kategoria_uj to cikk_kategoria;
    rename kategoria_uj to kategoria;

    7) ha már mindent 3x ellenőriztél, akkor eldobhatod az 5)-nél átnevezett táblákat.

    8) itt jön az előző hozzászólásom.

    NAGYON bátrak már az 5) pontnál tolhatják drop table-t.
    Aztán utólag ne panaszkodjanak, hogy DDLre nincs undo.

  • nyunyu

    félisten

    válasz Taci #5317 üzenetére

    Nem teljesen értem, mit akarsz feleslegesen verziózni rajta.

    Vedd a legfrissebb kategória táblázatodat, aztán annak az ID-it használd minden cikkhez.
    Aztán ha jön egy új kategória, akkor csak egy helyre kell beszúrni egy új rekordot, és annak az IDját használod az új cikkhez.

    Ha meg egy cikk rossz kategóriába került, és utólag kézzel kell javítani?
    Akkor átütöd a rossz cikk_kategoria rekordot.

    De az erősen kézi hajtány:
    merge into cikk_kategoria u
    using (
    select c.id cikk_id,
    c.cim cim
    k1.id rossz_kategoria_id,
    k2.id jo_kategoria_id,
    from cikkek c
    join kategoria k1
    on k1.nev = 'rossz kategória'
    join kategoria k2
    on k2.nev = 'jó kategória') x
    on (u.cikk_id = x.cikk_id and u.kategoria_id = x.rossz_kategoria_id)
    when matched
    then update
    set u.kategoria_id = x.jo_kategoria_id;

    (nem mertem sima update szintaxissal írni, mert tuti belegabalyodnék és/vagy egy sor helyett a fél táblát updateelné az Oracle :W)

Új hozzászólás Aktív témák