2016-11-12 71 views
0

我有兩個表刪除其中兩列匹配

Person (contain oldest date (farthest in future) when person moved OR WILL moved to another address) 

ID    OLDESTADDRESSMOVEDATE 

1      20161117 
2      20171211 
3      20160101 


Address   

PersonID    AddressMOVETODATE 
1      20161117 
1      20161111 
1      20141018 
2      20171211 
2      20151210 

現在我想寫一個DELETE查詢將DELETE FROM ADDRESS行中的每個人的人,在那裏AddressMOVETODATE是上一個比一個在OLDESTADDRESSMOVEDATE科拉姆

eg

如果我運行該查詢在地址表中剩餘的行應該是

PersonID    AddressMOVETODATE 
1      20161117 
2      20171211 

我已經試過

DELETE FROM ADDRESS WHERE PERSONID = PERSON.ID and AddressMOVETODATE < Person.OLDESTADDRESSMOVEDATE

,但它無法正常工作。另外,我們如何確保我們只輸入Person表的相應列,例如我們不想把事情弄糟通過把

Person ID = 1 and Person.OLDESTADDRESSMOVEDATE = 20171211 (of Person 2)

請幫助。

感謝,

艾登

+0

可能使用光標或INNER JOIN – Aiden

+1

請不要全部大寫輸入您的問題標題。這被認爲是在這裏,因爲它在網絡上的其他地方。它不會讓你早日得到答案,這會讓文本更難閱讀,而且這真的很粗魯和煩人。請有禮貌;鍵盤兩側都有Shift鍵,以便於觸及,因爲正確裝入的文字更易於閱讀和理解。謝謝。 –

+0

抱歉,不會再做 – Aiden

回答

1

您可以查詢使用ROW_NUMBER,CTE和刪除

;WITH cte AS 
(
    SELECT *, RowN = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY AddressMoveDate DESC) FROM Address 
) 
DELETE FROM cte WHERE RowN > 1 
+0

不需要添加ID以上的Person.ID inseat?在沒有提到身份證的情況下,它如何知道身份證來自Person?我們也沒有使用OLDESTADDRESSMOVEDATE爲什麼。 – Aiden

+0

這可以在沒有OVER和PARTITION的情況下完成嗎? – Aiden

+0

哇。良好的邏輯,但它給出了一些錯誤關鍵字'訂單'附近的語法不正確。 – Aiden