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 ____________

我在SQL Server中编写SQL时遇到问题。在这里,我有三个表,分别名为
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