SQL查询以显示表中只有一个值的行
我在SQL Server中编写SQL时遇到问题。在这里,我有三个表,分别名为SQL查询以显示表中只有一个值的行,sql,sql-server-2008,Sql,Sql Server 2008,我在SQL Server中编写SQL时遇到问题。在这里,我有三个表,分别名为User,Client,和UserClient。下面是表格内容的示例 客户端 idClient | client ____________________________ 1 | Client A 2 | Client B 3 | Client C idUserClient | idUser | idClient ____________
User
,Client
,和UserClient
。下面是表格内容的示例
客户端
idClient | client
____________________________
1 | Client A
2 | Client B
3 | Client C
idUserClient | idUser | idClient
____________________________________
1 | 1 | 1
2 | 1 | 2
3 | 2 | 1
4 | 2 | 3
5 | 3 | 1
用户
idUser | User
____________________________
1 | User A
2 | User B
3 | User C
USERCLIENT
idClient | client
____________________________
1 | Client A
2 | Client B
3 | Client C
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
假设(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
宾果
根据你提到的数据,你可以通过两种方式得到你想要的结果
select * from userclient where idUser = 3
或
我不确定你到底想要什么,但这两个案例产生了结果
你有什么疑问?这对我来说很有用
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
)
这将显示与客户端关联的用户
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和idClient=1上进行筛选,用户不是一个好的字段名,它是一个保留关键字是的,这只是一个示例,我不使用它作为实际的表名。thx btw的信息。我需要得到一个用户,只有一个从表userclient客户端客户端。我怎么做?那也许天蝎座的回答会有帮助?呜呜呜!这个答案花了我100多分!!谢谢你的支持,酒水是开着的。。那边那个人:D