从另一个具有多对多关系的表更新

问题描述 投票:0回答:1

以下是解释我需要执行的操作的示例表:我需要从状态表的 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 
sql-server
1个回答
0
投票

您很可能需要在这里预先聚合。一种方法是在

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;

db<>小提琴

© www.soinside.com 2019 - 2024. All rights reserved.