2017-04-05 17 views
0

私はSQL Serverを使用していますが、1つのレコード(有効)を除いてすべての重複レコード(無効)を更新する必要があります。私のクエリはROWNO戻っていない理由Groupbyと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 

私はので、私はそれらを更新することができます1より大きいRNを持つすべてのレコードをしたいです。あなたはちょうどこのようGROUP BYを使用することができます

答えて

0

、上記更新クエリから

;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 

このように、選択クエリの更新UNIQUE EMAILた​​め

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 

、電子メールの単一のエントリのみが利用可能となります他はステータス= 0として更新されます。

1

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

は試してみてください...

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ステートメントのように、アクセスする行またはアクセスしない行を選択することができます。

注:適切なテストデータがない場合にはこれをテストすることはできませんでしたが、ソースリストがソートされていない場合は、1で再起動するのではなく、現在の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; 

ご質問やご意見がありましたら、お気軽にコメントを投稿してください。

私は次のクエリを使用して重複行を選択するための
関連する問題