Если у вас есть (или вы можете создать) отдельную таблицу, содержащую группы, вы можете присоединить ее к таблице пользователей и сопоставить их с помощью функции charindex с запятой ваших данных с обеих сторон. Я бы протестировал производительность этого метода с некоторыми довольно экстремальными нагрузками перед развертыванием. Тем не менее, он имеет преимущество в том, что он самодостаточен и прост. Обратите внимание, что изменение примера для использования перекрестного соединения с предложением where приводит к тому же плану выполнения, что и этот.
Пример с данными:
SELECT *
<br>FROM (SELECT 1 AS ID,
<br> '1,2,3' AS MEMBERS
<br> UNION
<br> SELECT 2,
<br> '2'
<br> UNION
<br> SELECT 3,
<br> '3,1'
<br> UNION
<br> SELECT 4,
<br> '2,1') USERS
<br> LEFT JOIN (SELECT '1' AS MEMBER
<br> UNION
<br> SELECT '2'
<br> UNION
<br> SELECT '3'
<br> UNION
<br> SELECT '4') GROUPS
<br> ON CHARINDEX(',' + GROUPS.MEMBER + ',',',' + USERS.MEMBERS + ',') > 0</p>
<p>
Результаты:
id members group
1 1,2,3 1
1 1,2,3 2
1 1,2,3 3
2 2 2
3 3,1 1
3 3,1 3
4 2,1 1
4 2,1 2