<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Forum PostgreSQL - Jak napisać UPDATE z JOINEM zamiast porównania kluczy?]]></title>
	<link rel="self" href="http://forum.postgresql.org.pl/extern.php?action=feed&amp;tid=543&amp;type=atom"/>
	<updated>2011-02-16T13:09:33Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.postgresql.org.pl/viewtopic.php?id=543</id>
		<entry>
			<title type="html"><![CDATA[Odp: Jak napisać UPDATE z JOINEM zamiast porównania kluczy?]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2399#p2399"/>
			<content type="html"><![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]]]></content>
			<author>
				<name><![CDATA[Januszek]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1196</uri>
			</author>
			<updated>2011-02-16T13:09:33Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2399#p2399</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Jak napisać UPDATE z JOINEM zamiast porównania kluczy?]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2396#p2396"/>
			<content type="html"><![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]]]></content>
			<author>
				<name><![CDATA[rski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=26</uri>
			</author>
			<updated>2011-02-15T19:22:58Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2396#p2396</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Jak napisać UPDATE z JOINEM zamiast porównania kluczy?]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2392#p2392"/>
			<content type="html"><![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 :)]]></content>
			<author>
				<name><![CDATA[Januszek]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1196</uri>
			</author>
			<updated>2011-02-14T13:56:21Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2392#p2392</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Jak napisać UPDATE z JOINEM zamiast porównania kluczy?]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2388#p2388"/>
			<content type="html"><![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]]]></content>
			<author>
				<name><![CDATA[Rogo]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1161</uri>
			</author>
			<updated>2011-02-12T18:21:39Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2388#p2388</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Jak napisać UPDATE z JOINEM zamiast porównania kluczy?]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2387#p2387"/>
			<content type="html"><![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?]]></content>
			<author>
				<name><![CDATA[Januszek]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1196</uri>
			</author>
			<updated>2011-02-11T10:13:47Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2387#p2387</id>
		</entry>
</feed>
