Это покажет пользователей, которые связаны с клиентом idClient = 1
и только с этим клиентом:
SELECT
MAX(idUserClient) AS idUserClient,
idUser,
MAX(idClient) AS idClient
FROM USERCLIENT
GROUP BY idUser
HAVING COUNT(*) = 1
AND COUNT(CASE idClient WHEN 1 THEN 1 END) = 1
Предложение HAVING
проверяет, что группа строк для пользователя содержит ровно одну строку и среди«их» есть ровно одна строка, где idClient = 1
.
В качестве альтернативы, SQL Server 2008 позволит вам сделать что-то вроде этого:
WITH ranked AS (
SELECT
*,
rnk = ROW_NUMBER() OVER (
PARTITION BY idUser
ORDER BY CASE idClient WHEN 1 THEN 1 ELSE 0 END, idClient
)
FROM USERCLIENT
)
SELECT
idUserClient,
idUser,
idClient
FROM ranked
WHERE rnk = 1
AND idClient = 1
CTE ранжирует строки в USERCLIENT
таким образом, что если пользователь связан с idClient = 1
и не имеет другого клиента, соответствующая строка оценивается как 1, в противном случае строка с idClient = 1
(если такой присутствует) получает другой ранг.Поэтому при выборе из CTE вам просто нужно отфильтровать по rnk = 1 AND idClient = 1
.