sql anfänger

Ich habe eine Tabelle die wie folgt aussieht:
fk_nodename | fk_adaptername | port
------------------±-----------±-----
node102.pnet.ch | adapter01 | 2
node102.pnet.ch | adapter02 | 2
node202.pnet.ch | adapter01 | 3
node202.pnet.ch | adapter02 | 3
node101.pnet.ch | adapter01 | 4
node201.pnet.ch | adapter01 | 5

Nun möchte ich eine View kreieren, die mir folgende Darstellung macht:
fk_nodename | fk_adaptername1 | fk_adaptername2 | port
------------------±------------±------------±-----
node101.pnet.ch | adapter01 | | 4
node102.pnet.ch | adapter01 | adapter02 | 2
node201.pnet.ch | adapter01 | | 5
node202.pnet.ch | adapter02 | adapter01 | 3

Mit:
CREATE VIEW test AS
SELECT DISTINCT l1.fk_nodename ,l1.fk_adaptername as fk_adaptername1 ,l2.fk_adaptername as fk_adaptername2,l1.port
FROM config l1 LEFT JOIN config l2 ON (l2.fk_nodename = l1.fk_nodename and l2.fk_adaptername <> l1.fk_adaptername);

erhalte ich fast die Lösung:
fk_nodename | fk_adaptername1 | fk_adaptername2 | port
------------------±------------±------------±-----
node101.pnet.ch | adapter01 | | 4
node102.pnet.ch | adapter01 | adapter02 | 2
node102.pnet.ch | adapter02 | adapter01 | 2
node201.pnet.ch | adapter01 | | 5
node202.pnet.ch | adapter01 | adapter02 | 3
node202.pnet.ch | adapter02 | adapter01 | 3

Nun habe ich aber “doppelte” Einträge, die ich loswerden will:
node102.pnet.ch | adapter01 | adapter02 | 2
node102.pnet.ch | adapter02 | adapter01 | 2

Ist es möglich eine VIEW zu generieren, die diese “doppelten/äquivalenten” Einträge nicht
hat?

Gruss Reen

Möglicherweise suchst Du DISTINCT ON:

test=*# select * from node;
 name | adapter | port
------+---------+------
 n102 | a01     |    2
 n102 | a02     |    2
 n202 | a01     |    3
 n202 | a02     |    3
 n101 | a01     |    4
 n210 | a01     |    5
(6 rows)

Time: 0.911 ms
test=*# select distinct on (l1.name) l1.name, l1.adapter as adaptername1, l2.adapter as adaptername2, l1.port from node l1 left join node l2 on (l2.name=l1.name and l2.adapter <> l1.adapter) order by 1,2,3;
 name | adaptername1 | adaptername2 | port
------+--------------+--------------+------
 n101 | a01          |              |    4
 n102 | a01          | a02          |    2
 n202 | a01          | a02          |    3
 n210 | a01          |              |    5
(4 rows)

Andreas

Cool, das war genau was ich suchte. Vielen Dank. SQL macht mir noch ein bisschen Mühe, aber es macht Spass.

Möcht noch anmerken, daß DISTINCT ON nicht im SQL-Standard definiert ist, das ist eine (von vielen) nützlichen Erweiterungen, die PostgreSQL bietet. Aber SQL an sich macht schon Spaß, und wenn man dann auch noch PG hat…

Andreas, back from Chemnitz, war ein tolles Event mal wieder…

Kein Problem. Ich habe sowieso vor in Zukunft nur PG für meine Applikationen einzusetzen :slight_smile:

Vorbildlich :wink:

Andreas