查找具有不同字段的重复ID

时间:2014-06-19 12:20:22

标签: sql sql-server database

我有一个包含UserID和Departments的表。 UserID可以属于多个部门,因此他们的组合使其独一无二。

但是我一直在尝试查询试图找到UserID属于两个部门(hr或customer)之一的位置。

SELECT UserId, Dept, COUNT(*) Total
FROM MyTable
GROUP BY UserID
HAVING COUNT(*) = 1

然而,如果UserId同时拥有两个部门,这仍然会带来重复,因为组合使它成为一个独特的记录。

我得到的是这个

UserID | Department     |  Total  
1            hr              1  
2            customer        1  
3            customer        1  
1            customer        1  
3            hr              1  

但是我想要回来的是这个

UserID | Department     |  Total  
2            customer        1 

如果属于这两个部门的UserId的任何实例只有在属于这两个部门时才包括在内。

7 个答案:

答案 0 :(得分:1)

这应该做的工作

select t1.UserId, Dept, t2.Total
FROM MyTable t1
INNER JOIN
(
   SELECT UserId, COUNT(*) Total
   FROM Table1
   GROUP BY UserID
   HAVING COUNT(*) = 1
) t2 on t1.UserId = t2.UserId

答案 1 :(得分:0)

我不认为上面的查询会运行,因为Dept不在group by子句中,并且也不能以这种方式计算comparsion。
来你的问题:

Select userid, Dept 
from #temp
where userid in (Select userid from (Select userid,count(*) 'C' 
from #temp group by userid ) u where u.c=1)

我认为你不需要数,因为它总是1

答案 2 :(得分:0)

尝试

SELECT UserId,   COUNT(distinct Dept) Total
FROM MyTable
GROUP BY UserID
HAVING COUNT(distinct Dept) = 1

答案 3 :(得分:0)

您可以尝试这样的事情

select UserId, Dept
FROM Mytable where UserId in
(
   SELECT UserId, COUNT(*) Total
   FROM MyTable
   GROUP BY UserID
   HAVING COUNT(*) = 1
)

如果您在“组”中添加“部门”列,则始终会检索所有组合。 因此,您必须选择只有一个部门的所有用户,然后检索其他信息

可能存在语法错误,因为我通常使用oracle,但我认为这个概念是正确的

答案 4 :(得分:0)

这将选择' hr'那些没有客户身份的客户'然后用户'客户'在' hr'。中没有ID 我没有包含计数,因为它总是只有一个。

SELECT * FROM [MyTable] T WHERE Department = 'hr' AND NOT EXISTS (SELECT 1 FROM [MyTable] WHERE [MyTable].UserID =T.UserID AND Department = 'customer') UNION 
SELECT * FROM [MyTable] T WHERE Department = 'customer' AND NOT EXISTS (SELECT 1 FROM [MyTable] WHERE [MyTable].UserID =T.UserID AND Department = 'hr')

答案 5 :(得分:0)

问题是最后的COUNT (*)

试试这个:

SELECT UserId, Dept, COUNT(*) Total
FROM MyTable
GROUP BY UserID
HAVING COUNT(UserId) = 1

答案 6 :(得分:0)

这是一个假问题,因为您无法在此查询中使用Dept。 我不明白为什么作者没有向我们解释任何编译器警告,并告诉我们这个查询的一些结果。

但如果你真的想得到一些结果,你可以这样说:

SELECT UserId, min(Dept) as Dept
FROM MyTable
GROUP BY UserID
HAVING COUNT(*) = 1