我正在尝试运行一个简单的更新语句,该语句从一个表中获取数据并插入到另一个表中。问题是数据所在的表可能有一个或多个记录,所以我想使用包含数据的最新记录。
这是我的代码并且介意你这个代码最初工作得很好。我担心的是,如果我有多个记录的情况,我想更新最新记录的数据。包含数据的表确实有一个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。
答案 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