Meilleurs moyens d'écrire cette requête SQL

J'ai la structure de tableau ci-dessous

Utilisateurs (PK – UserId)
Système (PK – SystemId)
SystemRoles (PK-SystemRoleId, FK – SystemId)
UserRoles (PK-UserId & SystemRoleId, FK-SystemRoleId, FK-UserId)

Users peuvent avoir access à différents Systems et un System peut avoir différents SystemRoles définis.

Maintenant, je dois supprimer les Users qui ont des SystemRoles qui leur sont assignés SEULEMENT pour un System spécifique. S'ils ont des SystemRoles définis pour d'autres Systems , ils ne doivent pas être supprimés.

J'ai trouvé la requête ci-dessous pour identifier les loggings qui peuvent être supprimés, mais je pense que cela peut être optimisé. Aucune suggestion?

 SELECT U.* FROM ( SELECT distinct UR.UserID FROM dbo.UserRole UR INNER JOIN dbo.SystemRole SR ON (SR.SystemRoleID = UR.SystemRoleID) INNER JOIN dbo.[System] S ON (S.SystemID = SR.SystemID) WHERE S.SystemName = 'ABC' OR S.SystemName = 'XYZ' ) T INNER JOIN dbo.[User] U ON (U.UserID = T.UserID) WHERE T.UserID NOT IN ( select distinct UR.UserID from dbo.[UserRole] UR INNER JOIN dbo.SystemRole SR ON (SR.SystemRoleID = UR.SystemRoleID) INNER JOIN dbo.[System] S ON (S.SystemID = SR.SystemID) WHERE S.SystemName <> 'ABC' AND S.SystemName <> 'XYZ' ) 

Ce genre de structure vous permettra d'get les loggings dont vous avez besoin.

 select yourfields -- or delete from userroles where userid in (select userid from userroles join etc where system.name = the one you want except select userid from userroles join etc where system.name <> the one you want ) 

quelque chose comme ça?

 select userid from ( SELECT UR.UserID, max(case when (S.SystemName = 'ABC' OR S.SystemName = 'XYZ') then 1 else 0 end) as kill, max(case when (S.SystemName <> 'ABC' AND S.SystemName <> 'XYZ') then 1 else 0 end) as keep FROM dbo.UserRole UR INNER JOIN dbo.SystemRole SR ON (SR.SystemRoleID = UR.SystemRoleID) INNER JOIN dbo.[System] S ON (S.SystemID = SR.SystemID) group by UR.UserID ) u where kill = 1 and keep = 0