🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#330
Author: Mariusz Karpowicz
Date: Sun, 18 Apr 1999 20:16
35 lines
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
#331
Author: Kukula
Date: Mon, 19 Apr 1999 06:57
18 lines
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
#332
Author: Mundek
Date: Mon, 19 Apr 1999 07:18
45 lines
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
#333
Author: Andrzej Wilkoszewski
Date: Mon, 19 Apr 1999 07:51
20 lines
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
#334
Author: Traptak
Date: Wed, 21 Apr 1999 18:34
19 lines
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