我在SQL Server中编写SQL时遇到问题。在这种情况下,我有三个名为User
,Client
和UserClient
的表。以下是表格内容的样本
客户端
idClient | client
____________________________
1 | Client A
2 | Client B
3 | Client C
用户
idUser | User
____________________________
1 | User A
2 | User B
3 | User C
USERCLIENT
idUserClient | idUser | idClient
____________________________________
1 | 1 | 1
2 | 1 | 2
3 | 2 | 1
4 | 2 | 3
5 | 3 | 1
我需要一个查询来向用户显示idClient = 1
并且只有USERCLIENT
表中的一个客户端。如上面的示例所示,查询结果应为
idUserClient | idUser | idClient
_________________________________________
5 | 3 | 1
答案 0 :(得分:2)
(1)如果您只需要idUser
:
SELECT idUser
FROM USERCLIENT
GROUP BY idUser
HAVING COUNT(*)=1
(2)如果您需要USERCLIENT
表中的所有字段:
SELECT *
FROM USERCLIENT a
INNER JOIN
(
SELECT idUser
FROM USERCLIENT
GROUP BY idUser
HAVING COUNT(*)=1
) b ON a.idUser=b.idUser
答案 1 :(得分:1)
宾果!
SELECT * FROM USERCLIENT WHERE iduser IN
(SELECT iduser FROM USERCLIENT GROUP BY iduser HAVING COUNT(iduser)=1)
答案 2 :(得分:1)
这对我有用......
with cte AS
(
SELECT 1 AS idUserClient, 1 AS idUser, 1 AS idClient
UNION
SELECT 2 AS idUserClient, 1 AS idUser, 2 AS idClient
UNION
SELECT 3 AS idUserClient, 2 AS idUser, 1 AS idClient
UNION
SELECT 4 AS idUserClient, 2 AS idUser, 3 AS idClient
UNION
SELECT 5 AS idUserClient, 3 AS idUser, 1 AS idClient
)
SELECT * FROM cte c1
WHERE
idUserClient IN
(
SELECT MIN(c2.idUserClient) FROM cte c2 GROUP BY c2.idUser HAVING COUNT(c2.idUser) = 1
)
答案 3 :(得分:0)
假设(idUser, idClient)
是唯一索引:
SELECT USERCLIENT.idUser
FROM USER
INNER JOIN USERCLIENT
ON USER.idUser = USERCLIENT.idUser
WHERE USERCLIENT.idClient = 1
GROUP BY USERCLIENT.idUser
HAVING COUNT(*) = 1
答案 4 :(得分:0)
根据您提到的数据,您可以通过两种方式获得所需的结果。
select * from userclient where idUser = 3
或
select * form userClient where idUser = 3 and idClient = 1
我不确定你真正想要什么,但这两种情况会产生结果。
您需要查询什么?
答案 5 :(得分:0)
这将显示与客户端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,否则行{{1} (如果存在这样的一个)获得不同的排名。因此,从CTE中选择时,您只需要对idClient = 1
进行过滤。