Re: Funktionsargument für eine "field IN ($1)" Bedingung

From: Andreas Tille <tille(at)debian(dot)org>
To: Peter Eisentraut <peter_e(at)gmx(dot)net>
Cc: PostgreSQL <pgsql-de-allgemein(at)postgresql(dot)org>
Subject: Re: Funktionsargument für eine "field IN ($1)" Bedingung
Date: 2010-12-21 21:44:56
Message-ID: 20101221214456.GC7316@an3as.eu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

On Tue, Dec 21, 2010 at 12:47:41AM +0200, Peter Eisentraut wrote:
> Ich würde ungefähr so anfangen:
>
> SELECT package, version, architecture, maintainer, description FROM
> packages WHERE (package, version) IN (SELECT package, max(version) FROM
> packages WHERE package IN ('gcc', 'python', 'postgresql') GROUP BY
> package);

Ich habe es bereits so gemacht:

SELECT pkg.package, pkg.version, pkg.architecture, (SELECT release FROM releases WHERE sort = MAX(r.sort)) AS release
FROM packages pkg
JOIN (
SELECT pv1.package, MIN(architecture) AS architecture, pv1.version
FROM packages pv1
JOIN (
SELECT package, MAX(version) AS VERSION
FROM packages WHERE package IN ('worldwind', 'xplanet-images', 'xplanet', 'xulrunner-dev')
GROUP BY package
) mv ON pv1.version = mv.version AND pv1.package = mv.package
WHERE pv1.package IN ('worldwind', 'xplanet-images', 'xplanet', 'xulrunner-dev')
GROUP BY pv1.package, pv1.version
) sv1 ON pkg.version = sv1.version AND pkg.architecture = sv1.architecture
JOIN releases r ON r.release = pkg.release
WHERE pkg.package IN ('worldwind', 'xplanet-images', 'xplanet', 'xulrunner-dev')
GROUP BY pkg.package, pkg.architecture, pkg.version
;

was pro Paket die maximale Version, das letzte Release und "irgendeine"
Architektur (hier halt das Minimum) liefert. Die Konstruktion

WHERE (a , b) IN (SELECT a, b FROM ...)

kannte ich noch nicht. Bevor ich jetzt verschiedene Tests mache: Was ist
vorzuziehen: JOIN oder WHERE (a, b, c, d) IN (SELECT a, b, c, d) ?

> Das ist allerdings totlangsam, weil die UDD keine passenden Indexe
> gesetzt hat. Vielleicht mal einen Dump lokal einspielen und versuchen,
> ein paar Indexe zu setzen.

Ich habe eine "Test-UDD" und kann das dort mal probieren. Danke für den
Tip

Andreas.

--
http://fam-tille.de

In response to

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Andreas Tille 2010-12-22 08:32:08 Re: Funktionsargument für eine "field IN ($1)" Bedingung
Previous Message Martin Spott 2010-12-21 16:24:31 Re: Signal 11