【问题标题】:SSMS: Using MERGE INTO to Update Column from Same TableSSMS:使用 MERGE INTO 更新同一表中的列
【发布时间】:2013-12-06 08:37:09
【问题描述】:

我正在尝试使用同一表中的数据更新 FiscalYear 列中的值。我尝试了一个在此处找到的示例并针对我的目的对其进行了修改,它在我运行 SELECT 时提供了值,但无法让它对表进行实际更新。请让我知道我缺少什么或提供其他建议。谢谢!

MERGE INTO dbo.dim_Date as Dest
USING 
(
SELECT
   CASE WHEN t1.ID >= '20101001' and  t1.ID < '20111001' THEN 'FY2011'
     WHEN  t1.ID >= '20111001' and  t1.ID < '20121001'THEN 'FY2012'
     WHEN  t1.ID >= '20121001' and  t1.ID < '20131001'THEN 'FY2013'
     WHEN  t1.ID >= '20131001' and  t1.ID < '20141001'THEN 'FY2014'
     WHEN  t1.ID >= '20141001' and  t1.ID < '20151001'THEN 'FY2015'
     WHEN  t1.ID >= '20151001' and  t1.ID < '20161001'THEN 'FY2016'
     WHEN  t1.ID >= '20161001' and  t1.ID < '20171001'THEN 'FY2017'
     WHEN t1.ID >= '20171001' and  t1.ID < '20181001' THEN 'FY2018'
     WHEN  t1.ID >= '20181001' and  t1.ID < '20191001'THEN 'FY2019'
     WHEN  t1.ID >= '20191001' and  t1.ID < '20201001'THEN 'FY2020'
     WHEN  t1.ID >= '20201001' and  t1.ID < '20211001'THEN 'FY2021'
     WHEN  t1.ID >= '20211001' and  t1.ID < '20221001'THEN 'FY2022'
     WHEN  t1.ID >= '20221001' and  t1.ID < '20231001'THEN 'FY2023'
     WHEN  t1.ID >= '20231001' and  t1.ID < '20241001'THEN 'FY2024'
     WHEN t1.ID >= '20241001' and  t1.ID < '20251001' THEN 'FY2025'
     WHEN  t1.ID >= '20251001' and  t1.ID < '20261001'THEN 'FY2026'
     WHEN  t1.ID >= '20261001' and  t1.ID < '20271001'THEN 'FY2027'
     WHEN  t1.ID >= '20271001' and  t1.ID < '20281001'THEN 'FY2028'
     WHEN  t1.ID >= '20281001' and  t1.ID < '20291001'THEN 'FY2029'
     WHEN  t1.ID >= '20291001' and  t1.ID < '20301001'THEN 'FY2030'
     WHEN  t1.ID >= '20301001' and  t1.ID < '20311001'THEN 'FY2031'
     WHEN t1.ID >= '20311001' and  t1.ID < '20321001' THEN 'FY2032'
     WHEN  t1.ID >= '20321001' and  t1.ID < '20331001'THEN 'FY2033'
     WHEN  t1.ID >= '20331001' and  t1.ID < '20341001'THEN 'FY2034'
     WHEN  t1.ID >= '20341001' and  t1.ID < '20351001'THEN 'FY2035'
     WHEN  t1.ID >= '20351001' and  t1.ID < '20361001'THEN 'FY2036'
     WHEN  t1.ID >= '20361001' and  t1.ID < '20371001'THEN 'FY2037'
     WHEN  t1.ID >= '20371001' and  t1.ID < '20381001'THEN 'FY2038'
     WHEN t1.ID >= '20381001' and  t1.ID < '20391001' THEN 'FY2039'
     WHEN  t1.ID >= '20391001' and  t1.ID < '20401001'THEN 'FY2040'
     WHEN  t1.ID >= '20401001' and  t1.ID < '20411001'THEN 'FY2041'
     WHEN  t1.ID >= '20411001' and  t1.ID < '20421001'THEN 'FY2042'
     WHEN  t1.ID >= '20421001' and  t1.ID < '20431001'THEN 'FY2043'
     WHEN  t1.ID >= '20431001' and  t1.ID < '20441001'THEN 'FY2044'
     WHEN  t1.ID >= '20441001' and  t1.ID < '20451001'THEN 'FY2045'
     WHEN  t1.ID >= '20451001' and  t1.ID < '20461001'THEN 'FY2046'
     WHEN  t1.ID >= '20461001' and  t1.ID < '20471001'THEN 'FY2047'
     WHEN  t1.ID >= '20471001' and  t1.ID < '20481001'THEN 'FY2048'
     WHEN  t1.ID >= '20481001' and  t1.ID < '20491001'THEN 'FY2049'
     WHEN  t1.ID >= '20491001' and  t1.ID < '20501001'THEN 'FY2050'
   end as fiscalyear 
 FROM dbo.dim_Date t1
) as src

    on Dest.ID = src.ID
  WHEN MATCHED THEN
UPDATE 
SET FiscalYear =  src.fiscalyear
;

【问题讨论】:

  • 为什么要合并?每个钉子都需要一把锤子,即使是订书钉或螺丝钉?
  • MERGE 与 UPDATE 相比似乎是一种合理的方法。当然,我可能是错的。 = )
  • 对我来说似乎比 UPDATE 复杂 1000 倍。
  • 我开始同意你的观点

标签: sql-server merge sql-update


【解决方案1】:
UPDATE dbo.dim_Date
SET FiscalYear = 'FY'+STR(YEAR(DATEADD(mm,3,t1.ID)),4)

【讨论】:

  • 哇——这就是我喜欢 sql 的地方,总是其他/更好的解决方案。我需要确定您的代码是否适用于 10 月 1 日至 9 月 30 日等财年。谢谢!
  • 很抱歉我是个新手,但是您是说用您的语句替换 MERGE 末尾的 UPDATE 吗?看起来很合理,但我仍然在“dbo”附近收到错误语法错误。我想我知道为什么 - 让我检查一下......
  • DATEADD() 用于将 Oct->Sep 映射到 Jan->Dec。 YEAR() 提取数字年份。 STR() 将其转换为字符串。
  • 顺便说一句,我发布的是整个解决方案。不要使用合并。
  • 顺便说一句,我会“投票”你的解决方案,但我仍然没有足够的代表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
相关资源
最近更新 更多