2015-10-13 43 views
0

我想運行一個簡單的更新語句,它從一個表中獲取數據並插入到另一個表中。問題是數據所在的表可能有一個或多個記錄,所以我想使用包含數據的最新記錄。從另一個表更新一個表與最新記錄的最有效方法

這是我的代碼,並且介意你這段代碼最初工作得很好。我擔心的是,如果我遇到有多條記錄的情況,我想更新最新記錄的數據。與數據表確實有DateTimeEntered場利用:

Update C 
Set C.CaseNumber = L.Docket_NO 
From dbo.Cases as C 
Inner Join dbo.messages as L 
on L.AccountID = C.AccountID 
where (L.Docket_NO <> '' and L.Docket_NO != C.CaseNumber) 
or (L.Docket_NO <> '' and C.CaseNumber is Null) 

所以,如果我嘗試CTE的方法,我會做這樣的事情:

With CTE_Messages as (Select AccountID, DOCKET_NO, DateTimeEntered from dbo.messages where DateTimeEntered = (Select MAX(DateTimeEntered) from dbo.messages)) 

Update C 
Set C.CaseNumber = L.Docket_NO 
From dbo.Cases as C 
Inner Join CTE_Messages as L 
on L.AccountID = C.AccountID 
where (L.Docket_NO <> '' and L.Docket_NO != C.CaseNumber) 
or (L.Docket_NO <> '' and C.CaseNumber is Null) 

我需要插入其中,和/或條款加入CTE以獲取相關數據?我是不是在想這個CTE是不需要的,我只需要在Set上找到一個子查詢並在那裏查找最大日期時間?

我真的只是尋找最有效的方法來完成這一點。任何人都可以幫助這個SQL新手?任何洞察力將是最讚賞。

編輯:謝謝你的答案。但這是我的主要問題。

我最初使用是這樣的:

Update C 
    Set C.CaseNumber = L.Docket_NO 
    From dbo.CourtCases as C 
    Inner Join dbo.messages as L 
    on L.AccountID = C.AccountID 
    where (L.Docket_NO <> '' and L.Docket_NO != C.CaseNumber) 
    or (L.Docket_NO <> '' and C.CaseNumber is Null) 

這個簡單的更新語句的工作,直到我意識到,我不知道什麼記錄SQL從dbo.messages拉動更新CourtCases.CaseNumber。 Dbo.Messages是一個歷史表,可能有多個記錄。其中一些記錄會有所不同或老舊,需要更新。我最初鎖定到來自dbo.messages的Datetimeentered以給我最近的項目,但問題是並非dbo.messages中的每個記錄都包含要使用的Docket_NO。

回答

0

如果我理解這個正確的,你可以添加(在這種情況下「和」),另一個在哪裏選擇最近的記錄:

Update C 
Set C.CaseNumber = L.Docket_NO 
From dbo.Cases as C 
Inner Join dbo.messages as L 
on L.AccountID = C.AccountID 
where (L.Docket_NO <> '' and L.Docket_NO != C.CaseNumber) 
or (L.Docket_NO <> '' and C.CaseNumber is Null) 
**and c.casenumber = (Select c.casenumber from cases where datetimeentered = 
(select max(datetimeentered) from cases)** 
0

您可以使用ROW_NUMBER()就確定最近的記錄蒼蠅。如果您想反向執行此操作,並且只更新最近的[dbo].[messages]記錄和[dbo].[Cases]CaseNumber,則可以使用類似的邏輯更新CTE並更新CTE數據集中的最新記錄。如果你想更新第二個最近的記錄,你只需將1更新爲加入邏輯中的2 ...

With CTE As 
(
     Select Row_Number() Over (Partition By AccountID Order By DateTimeEntered Desc) As recentID, 
       AccountID, 
       Docket_NO 
     From dbo.messages 
     Where Docket_NO <> '' 
) 
Update C 
Set  CaseNumber = L.Docket_NO 
From dbo.Cases as C 
Inner Join CTE as L 
     On L.AccountID = C.AccountID 
     And L.recentID = 1 
Where L.Docket_NO != C.CaseNumber 
Or  C.CaseNumber Is Null