方案: 我有一个从一系列复杂连接中获得的结果集的简化版本。我已将结果集放在临时表中。结果集包含一天中活动/活动的记录。
我需要将具有相似日期的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子句进行分组 源行。
您可以建议哪些代码修改?
答案 0 :(得分:0)
这应该这样做:
//jQuery
$('.dataTable').dataTable( {
"columnDefs": [
{ "width": "45", "targets": 0 }
]
} );
//css
.dataTable > thead > tr > th:first-child {
width: 45px!important;
}
请注意,在我的测试中,我调用了我的表目标和列:mydate,starttime,endtime,activitya和activityb。
无需合并,(相对)简单的选择会产生您想要的结果。
HTH
PS当使用时间数据使用24小时制时,它会有所帮助。我假设到5点你真的是17点
答案 1 :(得分:0)
您不需要MERGE语句。
DECLARE @Test TABLE ([Id] int, [Date] nvarchar(10), [TimeIn] nvarchar(10), [TimeOut] nvarchar(10), [Reading] nvarchar(10), [Writeing] nvarchar(10))
INSERT INTO @Test
VALUES
(1,'08-01','8:00','5:00','Y',NULL),
(2,'08-02','8:00','5:00',NULL,'Y'),
(3,'08-02','5:00','12:00',NULL,'Y'),
(4,'08-03','8:00','5:00',NULL,'Y'),
(5,'08-04','1:00','5:00','Y',NULL),
(6,'08-04','5:00','7:00',NULL,'Y'),
(7,'08-04','7:00','10:00',NULL,'Y'),
(8,'08-04','10:00','13:00',NULL,'Y'),
(9,'08-05','8:00','5:00','Y',NULL)
;WITH CTE AS
(
SELECT
t1.[Date],
t1.TimeIn,
ISNULL(t2.TimeOut, t1.TimeOut) AS TimeOut,
ROW_NUMBER() OVER (PARTITION BY t1.[Date] ORDER BY t1.Id) AS RowNumber
FROM @Test AS t1
LEFT OUTER JOIN @Test AS t2 ON t1.TimeOut = t2.TimeIn AND t1.[Date] = t2.[Date]
)
SELECT
c.[Date],
(SELECT c2.TimeIn FROM CTE AS c2 WHERE c2.[Date] = c.[Date] AND c2.RowNumber = MIN(c.RowNumber)) AS TimeIn,
(SELECT c2.TimeOut FROM CTE AS c2 WHERE c2.[Date] = c.[Date] AND c2.RowNumber = MAX(c.RowNumber)) AS TimeOut
FROM CTE AS c
GROUP BY c.[Date]
答案 2 :(得分:0)
您可以在具有相同列的表中使用合并语句。您可以标识可用于唯一标识要合并的行的一个或多个列。