以下是解释我需要执行的操作的示例表:我需要从状态表的 StatusDate 列更新活动表的 ActivityDate 列,这样如果状态表中的 StatusID 为 X,则将活动 A 的活动表中的 ActivityDate 设置为StatusID 'X' 即“01-03-2024”,如果状态表中的 StatusID 为 Y,则将活动 B 和 C 的活动表中的 ActivityDate 设置为“15-03-2024”.... 等等
活动表:
商品ID | 活动ID | 活动日期 |
---|---|---|
1 | A | |
1 | B | |
1 | C | |
1 | D |
状态表
商品ID | 状态ID | 状态日期 |
---|---|---|
1 | X | 2024年1月3日 |
1 | 是 | 2024年3月15日 |
1 | Z | 2024年2月4日 |
这是我尝试过的查询:
UPDATE Activity
set a.ActivityDate=
case
when s.StatusID='X' AND a.ActivityID='A' THEN s.StatusDate
when s.StatusID='Y' AND a.ActivityID in ('B','C') THEN s.StatusDate
when s.StatusID='Z' AND a.ActivityID='D' THEN s.StatusDate
ELSE a.ActivityDate
END
from Activity a
left join Status s on a.ItemID=s.ItemID
您很可能需要在这里预先聚合。一种方法是在
APPLY
中使用派生表。由于表达式还需要 ActivityID
中的 Activity
列,因此您可以使用 VALUES
表构造“欺骗”外部表达式并引用该列。
最终结果如下:
SELECT V.*
INTO dbo.Activity
FROM (VALUES(1,'A',CONVERT(date,NULL)),
(1,'B',CONVERT(date,NULL)),
(1,'C',CONVERT(date,NULL)),
(1,'D',CONVERT(date,NULL)))V(ItemID ,ActivityID,ActivityDate);
SELECT *
INTO dbo.Status
FROM (VALUES(1,'X',CONVERT(date,'01-03-2024',103)),--Please do not use ambiguous dates
(1,'Y',CONVERT(date,'15-03-2024',103)),--Please do not use ambiguous dates
(1,'Z',CONVERT(date,'02-04-2024',103)) )V(ItemID,StatusID,StatusDate)--Please do not use ambiguous dates
GO
UPDATE A
SET A.ActivityDate = SD.StatusDate
FROM dbo.Activity A
OUTER APPLY (SELECT MAX(CASE WHEN s.StatusID='X' AND V.ActivityID='A' THEN s.StatusDate
WHEN s.StatusID='Y' AND V.ActivityID IN ('B','C') THEN s.StatusDate
WHEN s.StatusID='Z' AND V.ActivityID='D' THEN s.StatusDate
END) AS StatusDate
FROM dbo.Status S
CROSS APPLY (VALUES(a.ActivityID))V(ActivityID) --Gets around the outer reference
WHERE A.ItemID = S.ItemID) SD;
GO
SELECT *
FROM dbo.Activity;