<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Forum PostgreSQL - Jakie rozwiązanie byłoby najlepsze?]]></title>
		<link>https://forum.postgresql.org.pl/viewtopic.php?id=609</link>
		<description><![CDATA[Najświeższe odpowiedzi w Jakie rozwiązanie byłoby najlepsze?.]]></description>
		<lastBuildDate>Fri, 08 Jul 2011 15:27:44 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Odp: Jakie rozwiązanie byłoby najlepsze?]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=2597#p2597</link>
			<description><![CDATA[Wszystko już jasne. Dzieki.]]></description>
			<author><![CDATA[dummy@example.com (janekw)]]></author>
			<pubDate>Fri, 08 Jul 2011 15:27:44 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=2597#p2597</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Jakie rozwiązanie byłoby najlepsze?]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=2596#p2596</link>
			<description><![CDATA[[quote=gszpetkowski]Nie bardzo rozumiem co masz na myśli, wartości pnum są "na bieżąco" zachowywane w tabeli, dzięki czemu wiadomo, że nie należy ich ponownie wpisywać:

[/quote]


Miałem na myśli to, aby wszystkie odnalezione wartosci miały ten sam pnum - czyli aby mozna łatwo wybrac po pnum, ktore wartosci kID sa w jakis sposob ze soba polaczone.]]></description>
			<author><![CDATA[dummy@example.com (janekw)]]></author>
			<pubDate>Fri, 08 Jul 2011 14:27:37 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=2596#p2596</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Jakie rozwiązanie byłoby najlepsze?]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=2595#p2595</link>
			<description><![CDATA[Nie bardzo rozumiem co masz na myśli, wartości pnum są "na bieżąco" zachowywane w tabeli, dzięki czemu wiadomo, że nie należy ich ponownie wpisywać:

[code]IF isSet = false THEN[/code]]]></description>
			<author><![CDATA[dummy@example.com (gszpetkowski)]]></author>
			<pubDate>Fri, 08 Jul 2011 14:23:10 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=2595#p2595</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Jakie rozwiązanie byłoby najlepsze?]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=2594#p2594</link>
			<description><![CDATA[Serdeczne dziękuję za pomoc :) Czy dobrze myślę, że aby dla rozpatrywanego przypadku zachować wspólną wartość pnum, należałoby Twoją procedurę opakować zewnętrzną?]]></description>
			<author><![CDATA[dummy@example.com (janekw)]]></author>
			<pubDate>Fri, 08 Jul 2011 14:12:49 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=2594#p2594</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Jakie rozwiązanie byłoby najlepsze?]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=2593#p2593</link>
			<description><![CDATA[Myślę, że najlepszym wyjściem jest napisanie procedury PL/pgSQL, która odpowiednio aktualizuje kolumnę pNUM. Przykładowo:

[code]DROP TABLE IF EXISTS tab;

CREATE TABLE tab (
    kID INT8,
    pID INT8,
    pNUM INT8,
    PRIMARY KEY(kID, pID)
);

DELETE FROM tab;
INSERT INTO tab (kID, pID) VALUES
    (1, 1), (2, 2), (3, 3), (1, 2), (4, 1),
    (5, 3), (6, 1), (7, 2), (8, 6), (9, 1),
    (1, 7), (10, 90),
    (6, 4);[/code]

Procedura:

[code]CREATE OR REPLACE FUNCTION updateTab(kStart INT8, deep INT8 DEFAULT 1)
RETURNS void AS $$
DECLARE
    p INT8;
    k INT8;
    isSet boolean;
BEGIN
    UPDATE tab SET pNUM = kStart WHERE kID = kStart;
    FOR p IN SELECT pID FROM tab WHERE kID = kStart
    LOOP
        FOR k IN SELECT kID FROM tab WHERE pID = p
        LOOP
            SELECT INTO isSet pNUM IS NOT NULL FROM tab WHERE kID = k LIMIT 1;
            RAISE NOTICE 'k=%, isSet=%', k, isSet;
            IF isSet = false THEN
                RAISE NOTICE 'updateTab(%, %)', k, deep + 1;
                PERFORM updateTab(k, deep + 1);
            END IF;
        END LOOP;
    END LOOP;
    RETURN;
END $$
LANGUAGE 'plpgsql';[/code]

Uruchomienie:

[code]SELECT updateTab(1);[/code]

Przebieg:

[code]NOTICE:  k=4, isSet=f
NOTICE:  updateTab(4, 2)
NOTICE:  k=6, isSet=f
NOTICE:  updateTab(6, 3)
NOTICE:  k=9, isSet=f
NOTICE:  updateTab(9, 4)
NOTICE:  k=1, isSet=t
NOTICE:  k=4, isSet=t
NOTICE:  k=6, isSet=t
NOTICE:  k=9, isSet=t
NOTICE:  k=1, isSet=t
NOTICE:  k=4, isSet=t
NOTICE:  k=6, isSet=t
NOTICE:  k=6, isSet=t
NOTICE:  k=9, isSet=t
NOTICE:  k=1, isSet=t
NOTICE:  k=4, isSet=t
NOTICE:  k=6, isSet=t
NOTICE:  k=9, isSet=t
NOTICE:  k=1, isSet=t
NOTICE:  k=2, isSet=f
NOTICE:  updateTab(2, 2)
NOTICE:  k=7, isSet=f
NOTICE:  updateTab(7, 3)
NOTICE:  k=1, isSet=t
NOTICE:  k=2, isSet=t
NOTICE:  k=7, isSet=t
NOTICE:  k=1, isSet=t
NOTICE:  k=2, isSet=t
NOTICE:  k=7, isSet=t
NOTICE:  k=1, isSet=t
NOTICE:  k=1, isSet=t[/code]

Wynik:

[code]TABLE tab ORDER BY kID;
 kid | pid | pnum 
-----+-----+------
   1 |   1 |    1
   1 |   7 |    1
   1 |   2 |    1
   2 |   2 |    2
   3 |   3 |     
   4 |   1 |    4
   5 |   3 |     
   6 |   4 |    6
   6 |   1 |    6
   7 |   2 |    7
   8 |   6 |     
   9 |   1 |    9
  10 |  90 |     
(13 rows)[/code]

Parametr deep pozwala określic głębokość/poziom, łatwo np. dodać warunek, który blokuje możliwość nieskończonej rekurencji.]]></description>
			<author><![CDATA[dummy@example.com (gszpetkowski)]]></author>
			<pubDate>Fri, 08 Jul 2011 13:47:55 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=2593#p2593</guid>
		</item>
		<item>
			<title><![CDATA[Jakie rozwiązanie byłoby najlepsze?]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=2592#p2592</link>
			<description><![CDATA[Witam,

Nie bardzo potrafię sobie poradzić z następującym tematem: mam tabele tab(kID INT8, pID INT8, pNUM INT8). Kluczem głównym jest klucz złożony [kID,pID]. Mam np. takie krotki w tabeli:
[1, 1,null]
[2, 2,null]
[3, 3,null]
[1, 2,null]
[4, 1,null]
[5, 3,null]
[6, 1,null]
[7, 2,null]
[8, 6,null]
[9, 1,null]
[1, 7,null]
[10,90,null]

Dla wskazanego kID chcialbym znależć wszystkie inne kID ktore wiaza przez wspolne pole pID.
Przykladowo biore kID=1 i chce znalezc inne kID ktore wiaza sie przez wspolne pID, czyli: 
kID=1 => pID =1, ale dla pID=1 mam dodatkowo kID=4, kID=6, kID=9 => i tu znowu szukam dla uzsyskanych kID powiazan
kID=1 => pID =2, dla pID=2 mam dodatkowo kID=2, kID=7 => i tu znowu szukam dla uzsyskanych kID powiazan
kID=1 => pID =7, brak innych

Koniec bedzie wowczas gdy nie znajde juz zadnego nowego kID.
Wszystkie znalezione w ten sposob kID zostana oznaczone ta sama waroscia w polu pNUM.

Pasuje mi zastosowanie rekurencji w funkcji ale nie bardzo wiem jak jej uzyc.

Pozdrawiam]]></description>
			<author><![CDATA[dummy@example.com (janekw)]]></author>
			<pubDate>Thu, 07 Jul 2011 21:48:47 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=2592#p2592</guid>
		</item>
	</channel>
</rss>
