我需要更新与特定查询匹配的记录,因此我目前正在尝试找出如何找到一列重复值的列表。
我有以下表格定义
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。
感谢。
答案 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));