【问题标题】:Update temp table with Min Date用最小日期更新临时表
【发布时间】:2012-11-26 15:38:07
【问题描述】:

仅当存在更早的插入日期时,我才尝试更新 #tmpResults 表中所有不同的 AccIdAccNameHolder 组合的 InsertDate

表架构如下:

#tmpResults

Trans | AccId | AccountNameHolder | EarlyDate | CardType 

PositionCollection

Id | AccId | InsertDate | BtchId

卡错误

AccId | AccNameHolder | BtchId | TransId

这是我迄今为止尝试过的:

UPDATE  RES  
SET     EarlyDate = pc.InsertDate   
FROM  ( dbo.PositionCollection pc    
        LEFT JOIN dbo.CardErrors ce ON ce.BtchId = pc.BtchId AND pc.id =     ce.Transid  )    
    INNER JOIN #tmpResults RES   
ON      RES.AccId = pc.AccId    
AND     RES.AccNameHolder = ce.AccNameHolder    
WHERE   RES.EarlyDate = (SELECT MIN(InsertDate) FROM PostionCollection)    
AND     RES.AccId = pc.AccId    
AND     RES.AccNameHolder = ce.AccNameHolder

【问题讨论】:

  • 您能描述一下您的问题吗?你只是在说你在做什么。你有错误吗?
  • 嗨 - 我没有收到错误。代码未按预期更新 EarlyDate。这是 SQL Fiddle:sqlfiddle.com/#!3/28a81/8/0AccId 12345 是一个很好的例子,说明日期应该在哪里更新

标签: sql sql-server-2008 tsql


【解决方案1】:

在 UPDATE 语句中使用派生表

UPDATE x
SET x.EarlyDate = x.InsertDate  
FROM  ( 
       SELECT RES.EarlyDate, pc.InsertDate
       FROM dbo.PositionCollection pc
         LEFT JOIN dbo.CardErrors ce ON ce.BtchId = pc.BtchId AND pc.id = ce.Transid
         INNER JOIN #tmpResults RES ON RES.AccId = pc.AccId
           AND RES.AccNameHolder = ce.AccNameHolder
       WHERE RES.EarlyDate = (SELECT MIN(InsertDate) FROM PostionCollection) AND RES.AccId = pc.AccId
         AND RES.AccNameHolder = ce.AccNameHolder
       ) x

2012 年 11 月 27 日更新

UPDATE x
SET x.EarlyDate = x.InsertDate
FROM  (
       SELECT RES.EarlyDate, m.InsertDate
       FROM dbo.PositionCollection pc
         LEFT JOIN dbo.CardErrors ce ON ce.BtchId = pc.BtchId AND pc.id = ce.Transid
         INNER JOIN #tmpResults RES ON RES.AccId = pc.AccId AND RES.AccNameHolder = ce.AccNameHolder
         INNER JOIN (SELECT MIN(InsertDate) AS InsertDate FROM PostionCollection) m
           ON RES.EarlyDate = m.InsertDate 
       ) x

【讨论】:

  • 感谢 Alexander,但是我收到了不正确的语法错误:Msg 156, Level 15, State 1, Line 6 关键字“INNER”附近的语法不正确。消息 156,级别 15,状态 1,第 10 行关键字“AND”附近的语法不正确。
  • 它没有返回最小日期。它只返回临时表中现有的最小日期,而不是 PositionCollection 表中的最小日期。为了便于阅读,我已将 temptable 上的 InsertDate 更改为 EarlyDate。然后我将您的查询更改为SET x.EarlyDate = x.InsertDate,但仍然没有运气
  • 还没有,我在 SQL Fiddle 中放了一些东西来说明这个问题:sqlfiddle.com/#!3/28a81/8/0 AccId 12345 是一个很好的例子,说明应该在哪里更新日期。我也在尝试使用窗口函数来编写它,但我还没有在这里发布我的尝试。真的很感激。
  • 即在 ID:6676、6677、6680 和 6681 的 POSITIONCOLLECTION 表 [InserDate] 列中应在 [EarlyDate] 更新?
  • PositionCollection 表中的日期应该早于 tmpResults 表中的日期(这是我的错字)。我希望在 tmpResults 中为每个 accid/accnameholder 组合更新日期。
【解决方案2】:

这里有一些更通用的解决方案,对于 InsertDate 为空的情况,您可以将它们与 DateDiff 一起使用,以将条件更改为更早、更晚或其他类似的东西

OldInstDate <= COALESCE(NewInstDate, OldInstDate)

条件更新可以在select语句内实现所以...

SET InsertDate = COALESCE(InsertDate, NewInsertDate) WHERE...

SET InsertDate = CASE WHEN InsertDate IS NULL THEN NewInsertDate 
                      ELSE InsertDate END

WHERE ...
AND InsertDate IS NULL

关于子查询的真正清晰的帮助 http://allenbrowne.com/subquery-01.html 我认为这可能是我见过的最好的,http://allenbrowne.com/subquery-02.html 用于排除故障

【讨论】:

    猜你喜欢
    • 2021-03-09
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    相关资源
    最近更新 更多