Domanda

Ho due tavoli da una chiamata autorizzazioni e uno chiamato ruoli che sono collegati attraverso una terza tabella chiamamontanati di ruolo in una relazione N-N.

Permissions
 id <- PK
 name


Roles
 id <- PK
 name

RolePermisions
 RoleId  <-PK
 PermissionId <-PK
 isAllowed
.

Quello che voglio è ottenere l'elenco completo delle autorizzazioni di un ruolo specifico e null quando non c'è un valore nella tabella di riferimento per quel ruolo.Le entrate a sinistra di solito fanno il trucco, ma non posso lavorare questo.

In pratica diciamo che ho i seguenti valori:

In PermsissiSission:

1 - Per1
2 - Per2
3 - Per3
.

e in ruoli:

1 - Role1
2 - Role2
.

e in roblepermissions:

RoleId  -  PermissionId - isAllowed
 1            1             true
 1            2             false
 1            3             true
 2            1             true
.

La seguente query Sorta funziona ma non restituirà NULLS per tali valori non in acquirenze:

select permissions.name, rolepermissions.allowed 
FROM permissions LEFT JOIN rolepermissions  
    ON rolepermissions.permissionId = permissions.id 
WHERE rolepermissions.roleId = 2;
.

Il risultato che cercherei quando la query per il ruolo 2 è

Per1 - true
Per2 - NULL
Per3 - NULL
.

È stato utile?

Soluzione

Puoi farlo con un CROSS JOIN :

.
SELECT
    r.ID AS RoleID,
    p.ID AS PermissionID,
    rp.IsAllowed
FROM
    Roles r CROSS JOIN
    Permissions p LEFT JOIN
    RolePermissions rp ON rp.RoleId = r.ID AND rp.PermissionID = p.ID
WHERE r.ID = @RoleID
.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top