【发布时间】:2016-08-09 07:38:48
【问题描述】:
场景: 我有一个从一系列复杂连接中获得的结果集的简化版本。我已将结果集放在一个临时表中。结果集由一天中的活动记录组成。
我需要加入具有相似日期的 2 行(将一天的活动合并为一行),以便生成的结果集是
我正在努力完成这项工作
Merge #temp as target
using #temp as source
on (target.Date = source.Date) and target.Writing is NULL
when matched then
update set target.Writing = source.Writing;
但我遇到了这个错误:
MERGE 语句尝试更新或删除同一行 不止一次。当目标行匹配多个源时会发生这种情况 排。 MERGE 语句不能更新/删除目标的同一行 表多次。细化 ON 子句以确保目标行 最多匹配一个源行,或使用 GROUP BY 子句进行分组 源行。
您可以建议哪些代码修改?
【问题讨论】:
-
想要的结果从何而来?
(d,d,d,null),(e,e,null,e)怎么会被折叠成(d,e,d,e)? -
听起来您正在将流程分解为一系列 过程 步骤,并在优化数据时使用临时表作为某种形式的“临时空间”放。尽管您可以这样做,但理想情况下您不要将此类过程分解为一系列步骤。您使用 CTE 和/或子查询来描述您想要的整个结果,这样整个事情就是一个(大)查询,然后让优化器找出如何最好地产生这个结果。 IE。让 SQL 做它擅长的事情,使用集合。
-
@MartinSmith,所需的结果来自连接在一起的各种表。 Col1 = 进入时间,Col 2 = 超时,Col 3 = 活动 1,Col 4 = 活动 2。一天中的所有活动应仅反映在一行中
-
更新您的问题,使其清晰并包含所有必要信息。评论可能会消失。
-
为什么
Col 1选择d而不是e,其中Date是08-04,为什么e选择e而不是e选择Col 2同一行?
标签: sql-server merge