MySQL - update opierający się na wierszach poprzedzających

MySQL - update opierający się na wierszach poprzedzających
P5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 28
0

Muszę zrobić update kilkudziesięciu rekordów, chodzi o dodawanie czasu, ale dla ułatwienia napiszę liczby:

Kopiuj
ID     K1     K2     K3
1       8     12     20
2      22     18     40
3      40     13     53
4      53     10     63

Jak widać K1 = K3 dla poprzedniego wiersza, ale oprócz wiersza pierwszego/drugiego. A K3 = K1 + K2. Chodzi o to żeby zmienić wartości wierszy od 2 do 4 w taki sposób, żeby ta ciągłość była zachowana, czyli po updacie powinno wyglądać tak:

Kopiuj
ID     K1     K2     K3
1       8     12     20
2      20     18     38
3      38     13     51
4      51     10     61

Próbowałem coś takiego (piszę z głowy więc mogą być błędy)

UPDATE table as t1
LEFT JOIN table as t2 ON t1.ID = t2.ID -1
SET t1.K1 = t2.K3, t1.K3 = t1.K1 + t1.K2
WHERE t1.ID > 1

Ale zmianie podlega tylko pierwszy wiersz rekordów (czyli ID=2). Najwyraźniej każdy rekord jest updatowany na podstawie wartości sprzed wykonania zapytania, a ja bym chciał aby updatując każdy kolejny wiersz dane w poprzednim były już po zmianie. Nie wiem czy się tak da, pewnie celowo jest to zrobione w ten sposób, ale może jednak.

Albo może po prostu można to zrobić inaczej? Oczywiście mogę zrobić tyle zapytań ile rekordów i updatować pojedynczo, ale chciałem to zrobić jednym zapytaniem.

Można by to też zrobić w ten sposób, że na przykład pobieramy różnicę t1.K1-t2.K3 ładujemy ją do zmiennej i potem dodajemy w każdym wierszu do K1 i K3 ale...tego też nie wiem jak zrobić :D

Pomoże ktoś?

Ps. w tej chwili robię w MySQL, ale będę to przenosił na MS SQL, jak by dało radę to fajnie jak by zapytanie było zgodne dla obu baz

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

Baza jest zwyczajnie zdenormalizowana i zwykle w takiej sytuacji masz anomalie dokładnie jak te które opisujesz. Proste rozwiązanie: pozbyć się denormalizacji poprzez usunięcie kolumny K3. Jest ona zupełnie zbędna.
No bo skoro jej wartość zawsze da się policzyć na podstawie innych elementów rekordu to jaki sens ją przechowywać? To jest błąd i złamanie 2 formy normalnej...

P5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 28
0

Zdaję sobie z tego sprawę co mówisz choć nie znam fachowego nazewnictwa tego zjawiska (nie jestem programistą :) ). Po prostu zaczęło się od tego, że potrzeba było szybko przerzucać tabelkę z excela (harmonogram) na inne komputery, więc po prostu dane były ładowane z excela 1:1 i wypluwane po drugiej stronie (szybko zrobione, działało prawidłowo, a że niepoprawnie, to nie miało znaczenia, bo ciężko to było nazwać typową bazą danych w takim sensie o jakim tu rozmawiamy, ilością danych też nie trzeba było się przejmować). No ale z czasem okazało się, że można jeszcze by tak do tej tabelki dorobić...no i trochę to wyewoluowało.

No dobra, znormalizuję bazę i przerobię makra. Narobiłeś mi roboty :P

Dzięki.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.