查找其他列具有不同列的重复项

时间:2015-03-03 12:17:38

标签: sql sql-server

我需要更新与特定查询匹配的记录,因此我目前正在尝试找出如何找到一列重复值的列表。

我有以下表格定义

DocumentId (BIGINT)
NotePopupId (INT)
IsPopup (BIT)
Note (NVARCHAR(100))

我的表格可能包含如下数据:

1|1|False|Note1

1|2|False|Note2

2|1|False|Note1

2|2|True|Popup1

3|1|False|Note1

3|2|True|Popup1

4|1|False|Note1

4|2|False|Note2

我需要返回一个DocumentId列表,其中定义了多个DocumentId但IsPopup字段为True和False,并忽略那些全部为false或全部为true的那些。

我理解如何编写一个基本查询,它将返回重复的总数,但我不知道如何确保它只会返回其IsPopup字段设置为true且false为2的重复项或更多具有相同DocumentId的记录。

因此,在这种情况下,基于上述情况,它将返回DocumentId 2和3。

感谢。

4 个答案:

答案 0 :(得分:3)

我倾向于使用group by和聚合来处理这样的问题:

select documentId
from table
group by documentId
having min(cast(isPopup as int)) = 0 and max(cast(isPopup as int)) = 1;

答案 1 :(得分:2)

查找Distinct Count并过滤计数大于1的群组。试试这个。

select DocumentId 
from yourtable 
group by DocumentId 
having count(Distinct IsPopup)>1

如果您想在只有一个IsPopup时返回documentId,请使用此

select DocumentId 
from yourtable 
group by DocumentId 
having count(Distinct IsPopup)>1 or count(IsPopup)=1

答案 2 :(得分:0)

这可能会更有效率

select distinct t1.documentId
  from table t1 
  join table t2
    on t1.documentId = t2.documentId 
   and t1.IsPopup = 'true'
   and t2.IsPopup = 'false'

答案 3 :(得分:0)

SELECT  documentId
    from table
    group by documentId
     having min(convert(int,isPopup)) !=  max(convert(int,isPopup));