Subquery mehrfach verwenden?!

Hallo zusammen, ich habe mir ein kleines Item-Modell gebaut.
Hier solle eine universelle Datenstruktur (nur fürs Backend) entstehen.
Fürs Frontend sollen die Daten dann nochmals aufbereitet seperat gespeichert werden.

Tabellen:

  • [object]
  • [object]_attribute
  • [object]_reference

Diese drei Tabellen enthalten hier dann die verschiedenen Werde bzw. Konfigurationen.
Da ein Query über die Attribute für eine Suche sehr umfangreich werden aufgrund der Vererbung und Sprachabhängigkeit, wollte ich mir ein Subquery schreiben, welches ich mehrfach verwenden kann.

Z.B. In dieser Art:

SET subquery = (SELECT object_id, key, value FROM [...])
SELECT sq1.object_id
FROM subquery AS sq1
INNER JOIN subquery AS sq2 ON sq2.object_id = sq1.object_id
WHERE (
  (sq1.key = 'param1' AND sq1.value = 'testwert1')
  OR (sq1.key = 'param2' AND sq1.value = 'testwert2')
)
AND (sq2.key = 'param3' AND sq2.value = 'testwert3')

Ist eine solche Konstellation möglich? Wenn ja, wie? Leider meckert er z.B. beim SET-Befehl wegen dem Select. Wenn ich ein Alias auf ein Alias mache kommt “Relation xy not exists” oder ähnlich.
Eine View kommt aufgrund der Einschränkung im Subquery auf die notwendigen Parameter nicht in Frage.

Kann mir jemand von euch weiterhelfen?

Zuersteinmal: das mit den generischen Attributen ist eher verpönt und Du solltest Dir zweimal überlegen, ob Du das machen willst. Such mal im Netz nach dem Begriff EAV (Entity Attribute Value).

Auch wenn ich eigentlich grundsätzlich von diesem Ansatz abrate: folgende Variante sollte genau das machen, was Du willst.

[B]WITH subquery AS 
(
 SELECT object_id, key, value FROM [...]
) [/B]
SELECT sq1.object_id
FROM subquery AS sq1
INNER JOIN subquery AS sq2 ON sq2.object_id = sq1.object_id
WHERE (
  (sq1.key = 'param1' AND sq1.value = 'testwert1')
  OR (sq1.key = 'param2' AND sq1.value = 'testwert2')
)
AND (sq2.key = 'param3' AND sq2.value = 'testwert3')

Es wäre nett, wenn Ihr uns mitteilen würdet, in welche PostgreSQL Doku ihr die Definition “SET subquery” bzw “WITH subquery AS” gefunden habt.


mfg

fristo

In der offiziellen möglicherweise.

Andreas

Zu SET subquery kann ich nichts sagen. Soweit ich das sehe ist das keine Syntax von Postgres

Das von mir vorgeschlagene WITH subquery (offizieller Name “common table expression”) ist hier dokumentiert:

Hallo castorp,

danke für deine Hilfe.
Leider setze ich momentan noch die 8.3 ein.
WITH-Queries sind ein neues Feature der 8.4.
Jetzt wirds wohl Zeit für ein Update…

Gruß,
Daxi

Ja richtig, zwischenzeitlich hatte ich die Definition von “WITH (sub)query AS” als neues Feature in der Doku für PostgreSQL 8.4 auch gefunden.

Danke



mfg

FriSto