Thread View: pl.comp.lang.delphi.bazy-danych
5 messages
5 total messages
Started by Mariusz Karpowicz
Sun, 18 Apr 1999 20:16
Nie rozumiem takiego UPDATE'u
Author: Mariusz Karpowicz
Date: Sun, 18 Apr 1999 20:16
Date: Sun, 18 Apr 1999 20:16
35 lines
1749 bytes
1749 bytes
Witam Oto moje zmartwienie (nie az takie wielkie ale jednak..): Trzy realne tabele: 1) ABONAMENT (pola NRKOMORKI,OPLATA) 2) ROZMOWY (pola NRKOMORKI,OPLATA) 3) SUMA (pola NRKOMORKI, OPLATA) Tabele ABONAMENT i ROZMOWY sa wypelnione 'w calosci' zas tabela SUMA zawiera tylko numery komorek. Wykonuje dwa zapytania: 1) update SUMA set OPLATA=(select sum(OPLATA) from ABONAMENT where SUMA.NRKOMORKI=ABONAMENT.NRKOMORKI) tutaj jest jeszcze wszystko w porzadku, tabela SUMA update'uje sie poprawnie 2) update SUMA set OPLATA=OPLATA+(select sum(OPLATA) from ROZMOWY where SUMA.NRKOMORKI=ROZMOWY.NRKOMORKI) no i tutaj dzieje sie wlasnie to 'cos' : jesli w tabeli ROZMOWY nie bylo ani jednej rozmowy prowadzonej z ktorejs komorki to w tabeli SUMA dla tego rekordu jest wartosc NULL mimo iz po pierwszym update'cie byla tam jakas kwota (przypadek gdy jest abonament a nie ma rozmow) Pewnie cos zle zrobilem, moze ktos mi wskaze swiatlo w tunelu ? ps. sorry za taki zywcem wyrwany przyklad ale chyba tak jest bardziej pogladowo ... Pozdrawiam Mariusz Karpowicz mailto: M.Karpowicz@gazeta.pl
Re: Nie rozumiem takiego UPDATE'u
Author: Kukula
Date: Mon, 19 Apr 1999 06:57
Date: Mon, 19 Apr 1999 06:57
18 lines
1341 bytes
1341 bytes
[...] > 2) update SUMA set OPLATA=OPLATA+(select sum(OPLATA) from ROZMOWY where > SUMA.NRKOMORKI=ROZMOWY.NRKOMORKI) > > no i tutaj dzieje sie wlasnie to 'cos' : > jesli w tabeli ROZMOWY nie bylo ani jednej rozmowy prowadzonej z ktorejs > komorki to w tabeli SUMA dla tego rekordu jest wartosc NULL mimo iz po > pierwszym update'cie byla tam jakas kwota (przypadek gdy jest abonament > a nie ma rozmow) 1. Skoro jest dobrze to dobrze 2. Najprawdopodobniej jest tak, ze selekt wewnetrzny zwraca NULL. Nie potrafie wyjasnic dlaczego NULL + cokolwiek daje NULL. Mozesz sprobowac przekonwertowac NULLa z wewnetrznego selektu na 0. Mysle ze wtedy bedzie dzialac. -- batonoff@hotmail.com http://www.free.com.pl/kukula/default.htm
Re: Nie rozumiem takiego UPDATE'u
Author: Mundek
Date: Mon, 19 Apr 1999 07:18
Date: Mon, 19 Apr 1999 07:18
45 lines
2212 bytes
2212 bytes
On Sun, 18 Apr 1999, Mariusz Karpowicz wrote: > Witam > Oto moje zmartwienie (nie az takie wielkie ale jednak..): > > Trzy realne tabele: > 1) ABONAMENT (pola NRKOMORKI,OPLATA) > 2) ROZMOWY (pola NRKOMORKI,OPLATA) > 3) SUMA (pola NRKOMORKI, OPLATA) > > Tabele ABONAMENT i ROZMOWY sa wypelnione 'w calosci' zas tabela SUMA > zawiera tylko numery komorek. > > Wykonuje dwa zapytania: > 1) update SUMA set OPLATA=(select sum(OPLATA) from ABONAMENT where > SUMA.NRKOMORKI=ABONAMENT.NRKOMORKI) > > tutaj jest jeszcze wszystko w porzadku, tabela SUMA update'uje sie > poprawnie > > 2) update SUMA set OPLATA=OPLATA+(select sum(OPLATA) from ROZMOWY where > SUMA.NRKOMORKI=ROZMOWY.NRKOMORKI) Witam. Dzieje sie tak z prostej przyczyny. Jesli jakakolwiek czesc wyrazenia arytmetycznego ma wartosc NULL, to wtedy cale wyrazenie przyjmuje null. UPDATE SUMA set OPLATA=OPLATA+ISNULL((select sum(OPLATA) from ROZMOWY where SUMA.NRKOMORKI=ROZMOWY.NRKOMORKI),0) Funkcja ISNULL istnieje na MS-SQLServerze, ale w zasadzie na kazdym istnieje chyba podobna funkcja Pozdrawiam Mundek > > no i tutaj dzieje sie wlasnie to 'cos' : > jesli w tabeli ROZMOWY nie bylo ani jednej rozmowy prowadzonej z ktorejs > komorki to w tabeli SUMA dla tego rekordu jest wartosc NULL mimo iz po > pierwszym update'cie byla tam jakas kwota (przypadek gdy jest abonament > a nie ma rozmow) > > Pewnie cos zle zrobilem, moze ktos mi wskaze swiatlo w tunelu ? > > ps. sorry za taki zywcem wyrwany przyklad ale chyba tak jest bardziej > pogladowo ... >
Re: Nie rozumiem takiego UPDATE'u
Author: Andrzej Wilkoszewski
Date: Mon, 19 Apr 1999 07:51
Date: Mon, 19 Apr 1999 07:51
20 lines
1413 bytes
1413 bytes
Mariusz Karpowicz wrote: > > 2) update SUMA set OPLATA=OPLATA+(select sum(OPLATA) from ROZMOWY where > SUMA.NRKOMORKI=ROZMOWY.NRKOMORKI) > Standard SQL dopuszcza, że suma integer + NULL daje NULL należałoby napisać update SUMA set OPLATA=OPLATA + COALESCE( select sum(OPLATA) from ROZMOWY where SUMA.NRKOMORKI=ROZMOWY.NRKOMORKI), 0 ) Funkcja COALESCE zwraca priewszą wartość z listy, która nie jest NULL w SQL Anywhere istnieje również identyczna funkcja ISNULL() Andrzej Wilkoszewski
Re: Nie rozumiem takiego UPDATE'u
Author: Traptak
Date: Wed, 21 Apr 1999 18:34
Date: Wed, 21 Apr 1999 18:34
19 lines
1665 bytes
1665 bytes
Mariusz Karpowicz <chokai@kki.net.pl> napisał(a) w artykule <371A3DB6.7286915C@kki.net.pl>... > 2) update SUMA set OPLATA=OPLATA+(select sum(OPLATA) from ROZMOWY where > SUMA.NRKOMORKI=ROZMOWY.NRKOMORKI) > > no i tutaj dzieje sie wlasnie to 'cos' : > jesli w tabeli ROZMOWY nie bylo ani jednej rozmowy prowadzonej z ktorejs > komorki to w tabeli SUMA dla tego rekordu jest wartosc NULL mimo iz po > pierwszym update'cie byla tam jakas kwota (przypadek gdy jest abonament > a nie ma rozmow) > Dosyć skutecznym sposobem jest nadanie polu wartości DEFAULT na zero. Jeśli jednak w tworząc rekord z poziomu aplikacji wykonujesz insert dla wszystkich pól tabeli, to nadanie wartości domyślnej dla pola musi się odbyć z poziomu Delphi. Jeśli w insercie podajesz tylko pola wypełnione, to wystarczy klauzulka DEFAULT 0 dla kolumny tabeli. Traptak
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads