 <p>You could join <code>user_roles</code> just once and it might help performance a tiny bit. I cannot make up my mind right now which query I like more.</p> <pre><code>SELECT u.fname ,u.lname ,c.country ,c.postal FROM [user] u INNER JOIN company c ON (u.company_id = c.id) CROSS APPLY ( SELECT SUM (IIF(role_id = 3, 1, 0)) AS role3Count, SUM (IIF(role_id = 4, 1, 0)) AS role4Count FROM users_roles ur WHERE role_id BETWEEN 3 AND 4 AND u.id = ur.user_id ) ur WHERE role3Count &gt; 0 AND role4Count = 0 ORDER BY c.country, c.postal </code></pre> <p>This has the chance of being slightly faster because a single index seek on <code>users_roles</code> with range <code>role_id BETWEEN 3 AND 4</code> is enough to retrieve the roles. In your query, there were two seeks. On the other hand this query does some aggregates and computations. You'd need to measure.</p> <p>I'm not convinced this is a nicer query. It is more complex than yours. I'll propose it anyway. You decide.</p>