我正在使用SQL Server,我需要更新除一条记录(有效)之外的所有重复记录(无效)。
我不知道为什么我的查询没有返回rowno - 我总是得到1:
select *
from TABLE_NAME
inner join
(select
Contact_EmailID,
ROW_NUMBER() OVER (partition by Contact_EmailID order by Contact_EmailID) RN,
COUNT(*) AS COUNTM
from
TABLE_NAME
group by
Contact_EmailID
having
Contact_EmailID != '') as EmailDet On EmailDet.Contact_EmailID = TABLE_NAME.Contact_EmailID
where
EmailDet.COUNTM > 2
我想要RN
大于1的所有记录,以便我可以更新它们。
答案 0 :(得分:1)
您可以像这样使用GROUP BY
:
select *
from TABLE_NAME
inner join
(
SELECT Contact_EmailID
FROM TABLE_NAME
WHERE Contact_EmailID !=''
GROUP BY Contact_EmailID
HAVING COUNT(*) > 1
) as EmailDet
On EmailDet.Contact_EmailID=TABLE_NAME.Contact_EmailID
答案 1 :(得分:1)
请尝试......
SELECT *
FROM
(
SELECT *,
ROW_NUMBER() OVER ( PARTITION BY Contact_EmailID ORDER BY Contact_EmailID ) AS rowNum
FROM table_name
) tempTable
WHERE tempTable.rowNum > 1;
内部SELECT
语句应在每个记录旁边放置一个行号,该记录在电子邮件地址组中是唯一的。然后,您应该可以选择要执行或不希望访问的行,例如使用外部SELECT
语句。
注意:在没有任何合适的测试数据的情况下,我无法对此进行测试,但我希望在源列表未排序的情况下,它将继续每个ID的序列,而不是每当ID重新启动时即使之前遇到当前ID,也与先前的ID不同。如果确实发生了这个问题,请尝试...
SELECT *
FROM
(
SELECT *,
ROW_NUMBER() OVER ( PARTITION BY Contact_EmailID ORDER BY Contact_EmailID ) AS rowNum
FROM table_name
ORDER BY Contact_EmailID
) tempTable
WHERE tempTable.rowNum > 1;
如果您有任何问题或意见,请随时发表评论。
答案 2 :(得分:0)
我使用以下查询
SELECT * FROM
(
select ID,Contact_Name,Contact_EmailID,
ROW_NUMBER() over(partition by Contact_EmailID order by Contact_EmailID) RN
FROM AtsTool_ContactDetails
WHERE Contact_EmailID != '' and EmailVerifiedResponce='valid'
)T
WHERE RN>1
在选择查询
上更新UNIQUE EMAIL;with DeleteDuplicate AS
(
select ID,Contact_Name,Contact_EmailID, Status, EmailVerifiedResponce,
ROW_NUMBER() over(partition by Contact_EmailID order by Contact_EmailID) RN
FROM AtsTool_ContactDetails
WHERE Contact_EmailID != '' and EmailVerifiedResponce = 'valid'
)
UPDATE DeleteDuplicate SET [Status] = 0, EmailVerifiedResponce = 'invalid' WHERE RN>1
因此,从上面的更新查询中,只有单个条目的电子邮件可用,其他条目更新为status = 0。