2016-11-15 108 views
-5
SELECT 
    * 
FROM 
    Registrations AS R1 
    INNER JOIN Registrations AS R2 
     ON R2.UserItemId = R1.UserItemId 
     AND R2.CourseOfferingId = R1.CourseOfferingId 
     AND R2.Id != R1.Id 
WHERE 
    R2.Id > R1.Id 

我應該如何刪除重複值?刪除重複值SQL

感謝

+0

這個問題是不完整的,但我會提供給你:'從註冊刪除存在(從註冊r2中選擇1,其中r2.UserItemId = Registrations.UserItemId和r2.CourseOfferingId = Registrations.CourseOfferingId和r2.Id <註冊。 UserItemId' – shawnt00

+0

select 1意味着什麼在這裏? – user18160

+0

你可以使用'select *'或任何其他表達式。關鍵是子查詢是否返回一個結果 - 結果並不重要,如果你只運行'select 1 '你得到一個單行和一列的值爲'1' – shawnt00

回答

0

我會在你的問題採取了刺。這只是一個猜測,基於您提供的查詢。一個完整的問題將描述你的意思是一個重複的行。

delete from Registrations 
where exists (
    select 1 
    from Registrations r2 
    where r2.UserItemId = Registrations.UserItemId 
     and r2.CourseOfferingId = Registrations.CourseOfferingId 
     and r2.Id < Registrations.Id 
); 

顯然,你必須具有相同UserItemIdCourseOffereningId但不同Id值多行。我假設你想保留最低的Id並丟棄其他人。

查詢中的子查詢會爲每個行的表,並檢查是否有喜歡它,但以較低的編號另一行。如果答案是肯定的,則該行被刪除。

0

你可以嘗試這樣的查詢

;with cte as (
select *, RowN = row_number() over(partition by useritemid, courseofferingid, id order by id) from Registrations) 
delete from cte where Rown > 1 
+0

如果您包含有關CTE的參考文獻,爲了他們的緣故,這可能有助於OP ... –