日期:2014-05-17  浏览次数:20498 次

表中去除部分字段值相同的数据,只保留一行
自己写了一个比较麻烦的SQL,这样的(先不考虑效率)楼主用的是SQL Server
Contact表,去除AccountId和ContactName这两个字段值都相等的数据,保留一行
SELECT ContactId FROM Contact WHERE ContactId IN
(SELECT contactId FROM Contact c,
(SELECT AccountId,ContactName FROM Contact GROUP BY AccountId,ContactName HAVING count(*)>1) AS #tmp
where c.AccountId=#tmp.AccountId AND c.ContactName=#tmp.ContactName)
AND ContactId NOT IN(SELECT Max(ContactId) FROM Contact GROUP BY AccountId,ContactName HAVING count(*)>1);
测试了一下,有些问题,就是说如果字段值为NULL的时候
c.AccountId=#tmp.AccountId AND c.ContactName=#tmp.ContactName
这个判断就取不到数据了,因为要用 is NULL来判断,现在求大神可否解决此问题或者提供更好的方法,在线等,急!!
SQL

------解决方案--------------------
SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY accountid,contactname ORDER BY accountid) rn,* FROM contact) t
WHERE rn = 1
------解决方案--------------------

SELECT ContactId FROM Contact as a where not exists (select 1 from Contact as b on a.AccountId=b.AccountId and a.ContactName=b.ContactName and b.ContactId>a.ContactId)

------解决方案--------------------
c.AccountId=#tmp.AccountId AND c.ContactName=#tmp.ContactName

改成
isnull(c.AccountId,'')=isnull(#tmp.AccountId,'') AND isnull(c.ContactName,'')=isnull(#tmp.ContactName,'')