UPDATEs als Bündel absetzten
Hallo,
ich habe folgendes Problem:
Es sollen eine Reihe von UPDATES und INSERTS durchgeführt werden, in
Abhängigkeit von einem Kriterium (EXISTS (SELECT coa FROM defaults
WHERE coa=3D'Germany-DATEV-SKR03EU')):
UPDATE chart SET pos_ustva=3D96 WHERE accno IN ('1775') AND EXISTS
(SELECT coa FROM defaults WHERE coa=3D'Germany-DATEV-SKR03EU');
UPDATE chart SET pos_ustva=3D100 WHERE accno IN ('1776') AND EXISTS
(SELECT coa FROM defaults WHERE coa=3D'Germany-DATEV-SKR03EU');
....
Besteht in Postgressql die Möglichkeit, die UPDATES 'gebündelt'
abzusetzen, ohne jedes Mal einzeln die Prüfung auf das Kriterium
EXISTS (SELECT coa FROM defaults WHERE
defaults.coa=3D'Germany-DATEV-SKR03EU') durchführen zu müssen?
Viele Grüße
Udo Spallek
---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
choose an index scan if your joining column's datatypes do not
match
Re: UPDATEs als Bündelabsetzten
Am Mittwoch, 23. August 2006 15:44 schrieb udono:
> UPDATE chart SET pos_ustva=3D96 WHERE accno IN ('1775') AND EXISTS
> (SELECT coa FROM defaults WHERE coa=3D'Germany-DATEV-SKR03EU');
> UPDATE chart SET pos_ustva=3D100 WHERE accno IN ('1776') AND EXISTS
> (SELECT coa FROM defaults WHERE coa=3D'Germany-DATEV-SKR03EU');
> ...
>
> Besteht in Postgressql die Möglichkeit, die UPDATES 'gebündelt'
> abzusetzen, ohne jedes Mal einzeln die Prüfung auf das Kriterium
> EXISTS (SELECT coa FROM defaults WHERE
> defaults.coa=3D'Germany-DATEV-SKR03EU') durchführen zu müssen?
Ich denke, man könnte zum Beispiel die zu aktualisierenden Paare pos_us=
tva /
accno in einer Tabelle speichern und dann folgendes machen:
UPDATE chart
SET pos_ustva =3D COALESCE((SELECT pos_ustva FROM tmptbl WHERE accno =3D
chart.accno), pos_ustva)
WHERE EXISTS
(SELECT coa FROM defaults WHERE coa=3D'Germany-DATEV-SKR03EU');
Eventuell geht das mit UPDATE FROM noch etwas eleganter, wäre aber wohl=
equivalent.
--
Peter Eisentraut
http://developer.postgresql.org/~petere/
---------------------------(end of broadcast)---------------------------
TIP 1: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to majordomo [at] postgresql.org so that your
message can get through to the mailing list cleanly
Re: UP
am Wed, dem 23.08.2006, um 15:44:00 +0200 mailte udono folgendes:
> Hallo,
>
> ich habe folgendes Problem:
> Es sollen eine Reihe von UPDATES und INSERTS durchgeführt werden, in
> Abhängigkeit von einem Kriterium (EXISTS (SELECT coa FROM defaults
> WHERE coa=3D'Germany-DATEV-SKR03EU')):
>
> UPDATE chart SET pos_ustva=3D96 WHERE accno IN ('1775') AND EXISTS
> (SELECT coa FROM defaults WHERE coa=3D'Germany-DATEV-SKR03EU');
> UPDATE chart SET pos_ustva=3D100 WHERE accno IN ('1776') AND EXISTS
> (SELECT coa FROM defaults WHERE coa=3D'Germany-DATEV-SKR03EU');
> ...
>
> Besteht in Postgressql die Möglichkeit, die UPDATES 'gebündelt'
> abzusetzen, ohne jedes Mal einzeln die Prüfung auf das Kriterium
> EXISTS (SELECT coa FROM defaults WHERE
> defaults.coa=3D'Germany-DATEV-SKR03EU') durchführen zu müssen?
Mmmh.
Kannst Du die Wertepaare nicht schon in einer table vorher erfassen?
Ich meine sowas wie:
eine table foo, die upzudaten ist:
test=3D# select * from foo;
id | wert
----+------
1 | 0
2 | 0
3 | 0
(3 rows)
eine table bar, die id und wert enthält, was upzudaten ist:
test=3D*# select * from bar;
id | wert
----+------
1 | 10
2 | 20
(2 rows)
und nun:
test=3D*# update foo set wert =3D (select wert from bar where foo.id=3Dba=
r.id);
UPDATE 3
test=3D*# select * from foo;
id | wert
----+------
1 | 10
2 | 20
3 |
(3 rows)
bzw.: update foo set wert =3D (select wert from bar where foo.id=3Dbar.id=
)
where id in (select id from bar); um für id=3D3 korrekt zu arbeiten.
Andreas
--
Andreas Kretschmer
Kontakt: Heynitz: 035242/47215, D1: 0160/7141639 (mehr: -> Header)
GnuPG-ID: 0x3FFF606C, privat 0x7F4584DA http://wwwkeys.de.pgp.net
eMail schreiben kann jeder -- lernen: http://webserv/email/email.html
---------------------------(end of broadcast)---------------------------
TIP 4: Have you searched our list archives?
http://archives.postgresql.org
AW: [pgsql-de-allgemein] UPDATEs als Bündel absetzten
>
> Hallo,
>
> ich habe folgendes Problem:
> Es sollen eine Reihe von UPDATES und INSERTS durchgeführt
> werden, in Abhängigkeit von einem Kriterium (EXISTS (SELECT
> coa FROM defaults WHERE coa=3D'Germany-DATEV-SKR03EU')):
>
> UPDATE chart SET pos_ustva=3D96 WHERE accno IN ('1775') AND
> EXISTS (SELECT coa FROM defaults WHERE
> coa=3D'Germany-DATEV-SKR03EU'); UPDATE chart SET pos_ustva=3D100
> WHERE accno IN ('1776') AND EXISTS (SELECT coa FROM defaults
> WHERE coa=3D'Germany-DATEV-SKR03EU'); ...
>
> Besteht in Postgressql die Möglichkeit, die UPDATES 'gebündelt'
> abzusetzen, ohne jedes Mal einzeln die Prüfung auf das
> Kriterium EXISTS (SELECT coa FROM defaults WHERE
> defaults.coa=3D'Germany-DATEV-SKR03EU') durchführen zu müssen?
>
> Viele Grüße
> Udo Spallek
>
mal schnell 2 ideen
mmh zum bleistift die updates in einer funktion ausfuehren, an diese ein
array
mit den id=B4s uebergeben. zuerst ermitteln ob 'EXISTS (SELECT...' wenn nein
viel zeit gespart, wenn ja do it.
sicherlich wuerde es auch ueber rules gehen. ala 'EXISTS (SELECT...' ->ja,
dann
ok, wenn nicht 'DO INSTEAD NOTHING'
---------------------------(end of broadcast)---------------------------
TIP 4: Have you searched our list archives?
http://archives.postgresql.org
Re: [pgsql-de-allgemein] AW: [pgsql-de-allgemein] UPDATEs als Bündel absetzten
Hallo Rene,
rene hankel schrieb:
>> Besteht in Postgressql die Möglichkeit, die UPDATES 'gebündelt'
>> abzusetzen, ohne jedes Mal einzeln die Prüfung auf das
>> Kriterium EXISTS (SELECT coa FROM defaults WHERE
>> defaults.coa=3D'Germany-DATEV-SKR03EU') durchführen zu müssen?
>> Viele Grüße
>> Udo Spallek
> mal schnell 2 ideen
> mmh zum bleistift die updates in einer funktion ausfuehren, an
diese ein
> array
> mit den id=B4s uebergeben. zuerst ermitteln ob 'EXISTS (SELECT...'
wenn nein
> viel zeit gespart, wenn ja do it.
Das hört sich sehr elegant an.
Müsste mich auf jeden Fall mal mit Funktionen auseinandersetzten,
davon hab ich leider noch kaum einen Schimmer. Aber der Datenbank
stehen auf jeden Fall die PL/Perl und die PL/pgSQL zur Verfügung...
> sicherlich wuerde es auch ueber rules gehen. ala 'EXISTS
(SELECT...' ->ja,
> dann
> ok, wenn nicht 'DO INSTEAD NOTHING'
Rules sind auch eine Lücke bei mir... müsste ich mir aber auch mal
zu Gemüt führen.
Vielen Dank!
Schöne Grüße Udo
---------------------------(end of broadcast)---------------------------
TIP 1: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to majordomo [at] postgresql.org so that your
message can get through to the mailing list cleanly
Re: UP
Hallo Andreas,
[sorry für das Offlist Posting...]
A. Kretschmer schrieb:
> am Wed, dem 23.08.2006, um 15:44:00 +0200 mailte udono folgendes:
>> Besteht in Postgressql die Möglichkeit, die UPDATES 'gebündelt'
>> abzusetzen, ohne jedes Mal einzeln die Prüfung auf das Kriterium
>> EXISTS (SELECT coa FROM defaults WHERE
>> defaults.coa=3D'Germany-DATEV-SKR03EU') durchführen zu müssen?
> Mmmh.
> Kannst Du die Wertepaare nicht schon in einer table vorher erfassen?
Ja, ich denke das sollte möglich sein. Das Verfahren wäre dann so
wie von Dir und Peter Eisentraut beschrieben.
Vielen Dank!
Schöne Grüße Udo
---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?
http://www.postgresql.org/docs/faq
Re: UPDATEs als Bündel
[sorry für das Offlist Posting...]
Hallo Peter,
Peter Eisentraut schrieb:
>> Besteht in Postgressql die Möglichkeit, die UPDATES 'gebündelt'
>> abzusetzen, ohne jedes Mal einzeln die Prüfung auf das Kriterium
>> EXISTS (SELECT coa FROM defaults WHERE
>> defaults.coa=3D'Germany-DATEV-SKR03EU') durchführen zu müssen?
> Ich denke, man könnte zum Beispiel die zu aktualisierenden Paare pos_=
ustva /
> accno in einer Tabelle speichern und dann folgendes machen:
> UPDATE chart
> SET pos_ustva =3D COALESCE((SELECT pos_ustva FROM tmptbl WHERE accno =3D=
> chart.accno), pos_ustva)
> WHERE EXISTS
> (SELECT coa FROM defaults WHERE coa=3D'Germany-DATEV-SKR03EU');
Ok, es ist etwas umständlich, sollte aber gehen.
Schade das WHERE nicht bei Transaktionsblöcken geht...
Vielen Dank für den Tip
Schöne Grüße Udo
---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend
Re: [pgsql-de-allgemein] AW: [pgsql-de-allgemein] UPDATEs als Bündel absetzten
Hallo Rene,
rene hankel schrieb:
>> Besteht in Postgressql die Möglichkeit, die UPDATES 'gebündelt'
>> abzusetzen, ohne jedes Mal einzeln die Prüfung auf das
>> Kriterium EXISTS (SELECT coa FROM defaults WHERE
>> defaults.coa=3D'Germany-DATEV-SKR03EU') durchführen zu müssen?
>> Viele Grüße
>> Udo Spallek
> mal schnell 2 ideen
> mmh zum bleistift die updates in einer funktion ausfuehren, an
diese ein
> array
> mit den id=B4s uebergeben. zuerst ermitteln ob 'EXISTS (SELECT...'
wenn nein
> viel zeit gespart, wenn ja do it.
Das hört sich sehr elegant an.
Müsste mich auf jeden Fall mal mit Funktionen auseinandersetzten,
davon hab ich leider noch kaum einen Schimmer. Aber der Datenbank
stehen auf jeden Fall die PL/Perl und die PL/pgSQL zur Verfügung...
> sicherlich wuerde es auch ueber rules gehen. ala 'EXISTS
(SELECT...' ->ja,
> dann
> ok, wenn nicht 'DO INSTEAD NOTHING'
Rules sind auch eine Lücke bei mir... müsste ich mir aber auch mal
zu Gemüt führen.
Vielen Dank!
Schöne Grüße Udo
---------------------------(end of broadcast)---------------------------
TIP 4: Have you searched our list archives?
http://archives.postgresql.org