<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Forum PostgreSQL - Jak napisać UPDATE z JOINEM zamiast porównania kluczy?]]></title>
		<link>https://forum.postgresql.org.pl/viewtopic.php?id=543</link>
		<description><![CDATA[Najświeższe odpowiedzi w Jak napisać UPDATE z JOINEM zamiast porównania kluczy?.]]></description>
		<lastBuildDate>Wed, 16 Feb 2011 13:09:33 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Odp: Jak napisać UPDATE z JOINEM zamiast porównania kluczy?]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=2399#p2399</link>
			<description><![CDATA[@rski
Proponowane przez Ciebie rozwiązanie nie zadziała prawidłowo - wykona się UPDATE dla WSZYSTKICH wierszy w tabeli PRODUKTY, zamiast tylko dla spełniających warunki wejściowe. Nawiasem mówiąc testowałem ten wariant zanim stworzyłem ten wątek. Jeśli ma zadziałać z użyciem JOIN (w PostgreSQL) możemy napisać tak:
[code]
update produkty p1 set
    p1.cecha_produktu= 'Nowa wartość'
from
    produkty p2
    left join kat_produktu kp on (kp.id_kat_produktu = p2.id_kat_produktu)
where
    p1.id_produkt = p2.id_produkt
    and kp.cecha_w_slowniku = 'wartosc_powodujaca_zmiane'
[/code]
Wtedy UPDATE wykona się prawidłowo, jednak to nie jest najlepsze rozwiązanie, ponieważ przewidywana wydajność spada 2 do prawie 5 razy w porównaniu do dwóch wariantów poniżej:
[code]
update produkty p set
    cecha_produktu= 'Nowa wartość'
from
    kat_produktu kp
where
    p.id_kat_produktu = kp.id_kat_produktu
    and kp.cecha_w_slowniku = 'wartosc_powodujaca_zmiane'
[/code]
oraz
[code]
update produkty set
    cecha_produktu = 'Nowa wartość'
where id_kat_produktu in (
    select id_kat_produktu
    from kat_produktu
    where cecha_w_slowniku = 'wartosc_powodujaca_zmiane'
)
[/code]]]></description>
			<author><![CDATA[dummy@example.com (Januszek)]]></author>
			<pubDate>Wed, 16 Feb 2011 13:09:33 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=2399#p2399</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Jak napisać UPDATE z JOINEM zamiast porównania kluczy?]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=2396#p2396</link>
			<description><![CDATA[Zrób tak
[code]
update produkty set
    cecha_produktu= 'Nowa wartość'
from
    produkty p
    left join kat_produktu kp on (kp.id_kat_produktu = p.id_kat_produktu)
where
    kp.cecha_w_slowniku = 'wartosc_powodujaca_zmiane'
[/code]]]></description>
			<author><![CDATA[dummy@example.com (rski)]]></author>
			<pubDate>Tue, 15 Feb 2011 19:22:58 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=2396#p2396</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Jak napisać UPDATE z JOINEM zamiast porównania kluczy?]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=2392#p2392</link>
			<description><![CDATA[Dzięki za podpowiedź. Nie wiem dlaczego, ale rzadko używam operatora IN w zapytaniach.

Sprawdziłem wydajność obu rozwiązań i są bardzo zbliżone, jednak z delikatnym wskazaniem na wariant z użyciem IN i podzapytaniem (w moim przypadku: cost=25.91..108.34 v/s cost=25.91..114.56). Tylko ten zapis taki troszkę nieelegancki :)]]></description>
			<author><![CDATA[dummy@example.com (Januszek)]]></author>
			<pubDate>Mon, 14 Feb 2011 13:56:21 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=2392#p2392</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Jak napisać UPDATE z JOINEM zamiast porównania kluczy?]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=2388#p2388</link>
			<description><![CDATA[Witam

Też miałem kiedyś podobny problem ,próbowałem zrobić UPDATE łącząc kilka tabel, jednak z takim samym skutkiem jak u ciebie.
Na twoim przykładzie można zrobić jeszcze coś takiego:
[quote]
update produkty set
    cecha_produktu= 'Nowa wartość' 
    WHERE id_kat_produktu IN 
(SELECT id_kat_produktu FROM kat_produktu kp WHERE  cecha_w_slowniku =  'wartosc_powodujaca_zmiane')
[/quote]]]></description>
			<author><![CDATA[dummy@example.com (Rogo)]]></author>
			<pubDate>Sat, 12 Feb 2011 18:21:39 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=2388#p2388</guid>
		</item>
		<item>
			<title><![CDATA[Jak napisać UPDATE z JOINEM zamiast porównania kluczy?]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=2387#p2387</link>
			<description><![CDATA[Witam! To mój pierwszy post na tym forum :-)

Przykład uproszczony. Powiedzmy, że mamy dwie tabelki:
1) produkty (id_produkt, id_kat_produktu, cecha_produktu, ...)
2) kat_produktu (id_kat_produktu, cecha_w_slowniku, ...)
,gdzie pole produkty.id_kat_produktu jest referencją do pola w słowniku kat_produktu.id_kat_produktu

Chcąc zrobić UPDATE na tabeli produkty uzależniony od jakiejś cechy w słowniku kat_produktu (można to zagłębiać dalej, ale pozostańmy przy takim przykładzie) napisałem działający przykład:

[code]
update produkty p set
    cecha_produktu= 'Nowa wartość'
from
    kat_produktu kp
where
    p.id_kat_produktu = kp.id_kat_produktu
    and kp.cecha_w_slowniku = 'wartosc_powodujaca_zmiane'
[/code]

Chciałbym jednak zrobić to samo, ale z użyciem złączenia - tylko nie wiem jak, ponieważ poniższy kod nie zadziałał (świadomie użyłem left joina zamiast inner joina):

[code]
update p set
    p.cecha_produktu= 'Nowa wartość'
from
    produkty p
    left join kat_produktu kp on (kp.id_kat_produktu = p.id_kat_produktu)
where
    kp.cecha_w_slowniku = 'wartosc_powodujaca_zmiane'
[/code]

Pojawił się błąd:
[code]
ERROR:  relation "p" does not exist (LINE 1)
[/code]

To oznacza, że PostgreSQL nie rozumie takiego zapisu. Jak w takim razie napisać UPDATE z JOINEM na podanym powyżej przykładzie?]]></description>
			<author><![CDATA[dummy@example.com (Januszek)]]></author>
			<pubDate>Fri, 11 Feb 2011 10:13:47 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=2387#p2387</guid>
		</item>
	</channel>
</rss>
