从另一个表中更新最近记录的一个表的最有效方法

时间:2015-10-13 21:30:52

标签: sql sql-server sql-server-2008

我正在尝试运行一个简单的更新语句,该语句从一个表中获取数据并插入到另一个表中。问题是数据所在的表可能有一个或多个记录,所以我想使用包含数据的最新记录。

这是我的代码并且介意你这个代码最初工作得很好。我担心的是,如果我有多个记录的情况,我想更新最新记录的数据。包含数据的表确实有一个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)

我是否需要将where和/或子句插入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。

2 个答案:

答案 0 :(得分:0)

如果我理解正确,您可以添加其他地方(在这种情况下为&#39;和&#39;)以选择最新记录:

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)**

答案 1 :(得分:0)

您可以使用Row_Number()动态识别最新记录。如果您想反向执行此操作,并且仅使用[dbo].[messages]的{​​{1}}更新最新的[dbo].[Cases]记录,请使用类似的逻辑更新CTE,它会更新最新版本记录在CTE数据集中。如果您想更新第二个最新记录,您只需在Join逻辑中将1更新为2 ...

CaseNumber
相关问题