SQL Query显示表中只有一个值的行

时间:2011-09-30 08:41:05

标签: sql sql-server-2008

我在SQL Server中编写SQL时遇到问题。在这种情况下,我有三个名为UserClientUserClient的表。以下是表格内容的样本

客户端

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

6 个答案:

答案 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进行过滤。