Vinzenz Mai: Postgres Abfrage Problem

Beitrag lesen

Hallo,

in der tbl.role befindet sich folgende einträge:

id| name
  -----------

1 | Admin
2 | User
3 | Support

tbl.role2user hat:

id | fk_role | fk_user
  ----------------------

1 |    1    |    1
1 |    3    |    1
1 |    2    |    2

Nun möchte ich ein Abfrage, die mir anhand der userid (zB 1 oder 2) anzeigt, welche rollen verteilt wurden oder noch nicht verteilt wurden. Bei userid 1 sollte als ergebnis kommen:

Rollen die der User hat

role.id | role.name

1 | Admin
      3 | Support

Dies löste ich mit einem INNER JOIN

Gib mir die Spalten
    id,
    name
aus der Tabelle
    role
die verknüpft ist mit der Tabelle
    role2user
über
    gleiche Werte in den Spalten id der Tabelle role und fk_role in role2user
wobei nur die Datensätze interessieren
    bei denen in der Tabelle role2user die Spalte fk_user den Wert 1 hat

Alternativ könntest Du ein Subselect verwenden, was den Charme hat, dass Du damit den gleichen Lösungsweg hast wie für folgende Aufgabe:

Rollen die der User nicht hat

role.id | role.name
2 | User

Gib mir die Spalten
    id,
    name
aus der Tabelle role
wobei nur die Datensätze mit den id-Werten interessieren
    die nicht in der Liste der fk_role-Werte
        in der Tabelle role2user
    vorkommen
    wobei nur die Datensätze interessieren
        bei denen in der Tabelle role2user die Spalte fk_user den Wert 1 hat

Die WHERE-Klausel schriebest Du somit zu:

WHERE role.id NOT IN (  
    SELECT  
        fk_role  
    FROM  
        role2user  
    WHERE  
        fk_user = 1  
)

Mit einer leichten Abwandlung in der fünften Zeile kannst Du damit auch Teil 1 erledigen: lasse einfach "nicht" weg:

Gib mir die Spalten
    id,
    name
aus der Tabelle role
wobei nur die Datensätze mit den id-Werten interessieren
    die in der Liste der fk_role-Werte                    -- geändert!
        in der Tabelle role2user
    vorkommen
    wobei nur die Datensätze interessieren
        bei denen in der Tabelle role2user die Spalte fk_user den Wert 1 hat

Freundliche Grüße

Vinzenz