Hier auch nochmal ein Beispiel der View:
Meine Ausgangsdaten:
Code: Alles auswählen
test=# \d produkt
Tabelle »public.produkt«
Spalte | Typ | Sortierfolge | NULL erlaubt? | Vorgabewert
--------+-----------------------+--------------+---------------+-------------
name | character varying(20) | | |
id | integer | | |
status | boolean | | |
code | character varying(20) | | |
test=# select * from produkt;
name | id | status | code
---------+----+--------+------
bananen | 1 | t | BANA
aepfel | 3 | t | APPL
trauben | 4 | t | TRAU
orangen | 2 | f | ORAN
(4 Zeilen)
test=# \d preisliste
Tabelle »public.preisliste«
Spalte | Typ | Sortierfolge | NULL erlaubt? | Vorgabewert
---------+-----------------------+--------------+---------------+-------------
verweis | character varying(50) | | |
preis | double precision | | |
test=# select * from preisliste;
verweis | preis
-----------------+-------
kundenpreis,1 | 20
kundenpreis,2 | 19
kundenpreis,3 | 5
einkaufspreis,4 | 11
(4 Zeilen)
Eine View würde ich dann so anlegen:
Code: Alles auswählen
CREATE VIEW preisliste_separiert AS
SELECT
SPLIT_PART(verweis,',',1) AS preis_typ,
CAST(SPLIT_PART(verweis,',',2) AS INT) AS produkt_id,
preis
FROM preisliste;
Die CAST-Funktion wandelt den String in eine Zahl um, damit die Datentypen der IDs jeweils beide gleich (hier INT) sind.
Mit dem Ergebnis:
Code: Alles auswählen
SELECT * FROM preisliste_separiert;
preis_typ | produkt_id | preis
---------------+------------+-------
kundenpreis | 1 | 20
kundenpreis | 2 | 19
kundenpreis | 3 | 5
einkaufspreis | 4 | 11
(4 Zeilen)
Dann kann man da wunderbar den JOIN darauf ausführen:
Code: Alles auswählen
SELECT produkt.name, produkt.code, produkt.status, preisliste_separiert.preis
FROM produkt
INNER JOIN
preisliste_separiert ON
produkt.status = TRUE
AND preisliste_separiert.preis_typ = 'kundenpreis'
AND produkt.id = preisliste_separiert.produkt_id;
name | code | status | preis
---------+------+--------+-------
bananen | BANA | t | 20
aepfel | APPL | t | 5
(2 Zeilen)
Ich gehe davon aus, dass die Reihenfolge der Ausdrücke für die Performance wichtig ist. Die einfachen Ausdrücke zuerst und zum Schluß dann die Ausdrücke, bei denen die Daten beider Tabellen zu vergleichen sind.
Hier auch nochmal der Dump der kleinen Datenbank:
42049