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

  • nyunyu
    félisten

    Üdv,

    adott egy tábla (cikktorzs_customer) amiben a cust_partnerkod hibás kód miatt több ezer rekord esetében azonos értéket vett fel (200000). Akarnék egy updatet az érintett rekordokra ami annyit csinál, h kiolvassa a mindig aktuálisan legnagyobb partnerkódot és ahhoz egyet hozzáad.

    UPDATE cikktorzs_customer c_c, (SELECT cust_partnerkod AS i_c_p FROM cikktorzs_customer ORDER BY cust_partnerkod DESC LIMIT 1) i_c_c
    SET `cust_partnerkod` = i_c_p + 1
    WHERE c_c.cust_partnerkod = 200000

    A gond ezzel annyi, h a belső select nem értékelődik ki újra minden alkalommal, így az összes rekord ami eddig 200000 volt, most 200001 lett. Ki tudja a megoldást?
    Előre is köszi annak, aki :)

    Javaslom a szabványos merge szintaxis tanulmányozását.

    Sok fejfájástól megment, ha több tábla joinja alapján kell updatelni egy táblát...

    Egyébként már az updateedet sem értem, miért kéne többször lefutnia az alselectnek, ha egyre limitáltad a visszaadható eredmény számát?
    Meg a join feltétel is kompletten hiányzik, ami alapján leválogatnád, hogy melyik rossz sorhoz milyen jó partnerkód tartozna.

    Ez most pont azt csinálja, hogy leválogatja a legnagyobb partnerkódot, és annyi+1-et ráupdatel minden 200000-es sorra. :DDD

    Ezzel maximum annyit tudsz csinálni, hogy beteszed egy kurzorba az összes 200000-es sort, aztán egyesével végigiterálva rajtuk mindig eggyel nagyobb értékkel updateled őket.

    Vagy valami nagyon elborult merget írsz, ami besorszámozza a sorokat, aztán az alapján updatel:
    merge into cikktorzs_customer u
    using (select cc.id, cc.cust_partnerkod, row_number() over (order by cc.id) rn
    from cikktorzs_customer cc
    where cc.cust_partnerkod = 200000) x
    on (u.id = x.id)
    when matched
    then update set u.cust_partnerkod = x.cust_partnerkod + x.rn;

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