У меня есть две таблицы, такие как:

Таблица 1

-----------------------------------------
TID1     Name      Status        LastStatus         
-----------------------------------------
1        A         1             3

Таблица 2

-----------------------------------------
TID2     TID1     oDate          Status
-----------------------------------------
1        1        2020-04-01     1
2        1        2020-04-03     2
3        1        2020-04-05     3

Сценарий таков: если я обновлю Table2 в TID2 = 2, LastStatus в Table1 не следует обновлять, поскольку существует {MAX Date} Table2 с {TID1=1 . Поэтому LastStatus в Table1 будет обновляться только при наличии обновления Table2 с MAX Date.

В настоящее время я работаю только с Table2. Это не влияет на Table1. Ниже мой код:

-- Insert Statement
Declare @TID1 int, @oDate DateTime, @Status int;
Set @TID1 = 1;
Set @oDate = '2020-04-05';
Set @Status = 3;
Insert into Table2 (TID1, oDate, Status) values (@TID1, @oDate, @Status)

-- Update Statement (Example only - if there's a row to be updated)
Update Table2 Set TID1=@TID1, oDate=@oDate, Status=@Status
where TID2 = 3

Кто-нибудь знает как это решить?

0
Haminteu 29 Апр 2020 в 07:28

2 ответа

Во-первых, решение зависит от того, откуда вы вызываете этот SQL? Это приложение? Хранимая процедура? SSMS ? Другой?

В идеале вы должны объединить вставки / обновления обеих таблиц в хранимую процедуру, где вы будете делать что-то вроде следующего:

-- Insert into Table2
insert into dbo.Table2 (TIDI1, oDate, [Status])
  select @TIDI1, @oDate, @Status;

-- OR

-- Update Table2
update dbo.Table2 set
  TID1 = @TIDI1
  , oDate = @oDate
  , [Status] = @Status
where TID2 = @TID2;

-- Then update table1 if the date we just added is the latest or more recent
update dbo.Table1 set
  LastStatus = @Status
where TID1 = @TIDI1
and @oDate >= (select max(oDate) from dbo.Table2 T2 where T2.TID1 = @TID1);

Если вы не можете спроектировать свою систему так, чтобы у вас был контроль над обоими утверждениями, вы можете рассмотреть возможность использования триггера для выполнения того же действия, например

create trigger dbo.Table2_UpdateTable1
on dbo.Table2
for insert, update
as
begin
  update T1 set
    LastStatus = [Status]
  from dbo.Table1 T1
  inner join (
    select I.TID1, I.[Status]
    from Inserted I
    where I.oDate >= (select max(oDate) from dbo.Table2 T2 where T2.TID1 = I.TID1)
  ) T3 on T3.TID1 = T1.TID1;
end
0
Dale K 29 Апр 2020 в 08:12

Ну, я нашел свой ответ .. Большое спасибо за ответ на мой вопрос.

update      ActivityPlanHistory
    set         ActivityPlanId = ActivityPlanId, UpdateDate = @UpdateDate, 
                StatusId = @StatusId, Remarks = @Remarks
    where       ActivityPlanHistoryId = @ActivityPlanHistoryId;

    if (select max(UpdateDate) from ActivityPlanHistory where ActivityPlanId = @ActivityPlanId) <= @UpdateDate
        begin 
            update      ActivityPlan 
            set         LastStatus = @StatusId, LastUpdateDate = @UpdateDate, 
                        LastRemarks = @Remarks
            where       ActivityPlanId = @ActivityPlanId
        end
    else
        begin
            print 'do nothing';
        end
0
Haminteu 29 Апр 2020 в 08:59