我在从Oracle更新到SQL Server时遇到了麻烦
我对SQL Server的更新有疑问。在Oracle中,我设法做到了,但在SQL Server中,我没有得到它。
下面是两个例子(Oracle工作,但SQL Server返回错误:
聚合不能出现在UPDATE语句的集合列表中
甲骨文
UPDATE
tab1
SET
(t1.va, t1.vb) = (
SELECT
sum(
CASE
WHEN (t2.date2 - t2.date1) <= 30 THEN Coalesce((t2.x + t2.y), 0)
END
) * 100,
sum(
CASE
WHEN (t2.date2 - t2.date1) <= 60
AND (t2.date2 - t2.date1) > 30 THEN Coalesce((t2.y + t2.z), 0)
END
) * 100
FROM
tab2 t2
WHERE
t2.cd_xyz = tab1.cd_xyz
);
SQL Server
UPDATE
tab1 t1
SET
t1.va = sum(
CASE
WHEN (t2.date2 - t2.date1) <= 30 THEN COALESCE((t2.x + t2.y), 0)
END
) * 100,
t1.vb = sum(
CASE
WHEN (t2.date2 - t2.date1) <= 60
AND (t2.date2 - t2.date1) > 30 THEN COALESCE((t2.y + t2.z), 0)
END
) * 100
FROM
tab2 t2
INNER JOIN tab1 t1 ON t2.cd_xyz = t1.cd_xyz;
您需要计算要在子查询中使用的值,然后使用文档中的UPDATE ... FROM
语法将其连接到正在更新的表上。
我不太确定我是否正确表达了你的逻辑,因为你没有任何分组,但有一个和,但这应该足以让你开始。
UPDATE tab1 SET
va = t2a.vaNew
, vb = t2a.vbNew
FROM tab1
INNER JOIN (
SELECT
cd_xyz
, SUM(
CASE
WHEN (t2.date2 - t2.date1) <= 30 THEN COALESCE((t2.x + t2.y), 0)
END
) * 100 as vaNew
, SUM(
CASE
WHEN (t2.date2 - t2.date1) <= 60
AND (t2.date2 - t2.date1) > 30 THEN COALESCE((t2.y + t2.z), 0)
END
) * 100 AS vbNew
FROM tab2 t2
GROUP BY cd_xyz
) AS t2a ON t2a.cd_xyz = t1.cd_xyz;