#sql-server
Вопрос:
Необходимо обновить AttentionStatus
/ UpdatedDate
для PatientId
в таблице 1, когда новая запись вставляется в таблицу 2, также необходимо переместить AttentionStatus
( CurrentStatus
) в PreviousStatus
. Значение обновления основано на последней вставке в таблице 2.
Код:
create table Table1
(
Id int,
PatientName varchar(200),
AttentionStatus varchar(20),
PreviousStatus varchar(20),
UpdatedDate datetime
)
create table Table2
(
Id int identity(1,1),
PatientId int,
Attention varchar(20),
Date datetime
)
insert table1 select 101, 'Patient1', 'Yellow', 'Red', '2021-05-28 03:22:06.650'
insert table1 select 102, 'Patient2', 'Red', 'Yellow', '2021-05-26 14:29:52.620'
insert table2 select 1, 101, 'Yellow', '2021-05-28 03:22:06.650'
insert table2 select 2, 101, 'Red', '2021-05-28 03:14:56.010'
insert table2 select 3, 102, 'Red', '2021-05-26 14:29:52.620'
insert table2 select 4, 102, 'Yellow', '2021-05-25 10:27:37.107'
insert table2 select 5, 102, 'Green', '2021-05-24 06:13:18.430'
Id PatientName AttentionStatus PreviousStatus UpdatedDate
101 Patient1 Yellow Red 2021-05-28 03:22:06.650
102 Patient2 Red Yellow 2021-05-26 14:29:52.620
Ввод:
insert table2 select 102, 'Green', '2021-05-29 10:24:25.007'
Ожидаемый результат:
Id PatientName AttentionStatus PreviousStatus UpdatedDate
101 Patient1 Yellow Red 2021-05-28 03:22:06.650
102 Patient2 Green Red 2021-05-29 10:24:25.007
Это моя попытка задать вопрос:
update table1
set AttentionStatus = t2.attention,
previousstatus = t1.attentionstatus,
UpdatedDate = t2.date
from table1 t1
inner join
(select patientid, attention, date
from table2
group by patientid, attention
having date = max(Date)) t2 on t1.id = t2.PatientId
where t1.id = 102
Комментарии:
1. пожалуйста, покажите свой запрос на попытку
2. Я не понимаю: если
update table1
запрос выполняется в одном пакете , то вы должны знать, какие строки они содержатhaving...
, и если он выполняется в триггере, вы должны использоватьinserted
таблицу. Так как же ты этим управляешьupdate
?
Ответ №1:
Вам не нужны поля AttentionStatus
и PreviousStatus
(из-за нормализации базы данных.
см. раздел DBFIDDLE
Код:
ALTER TABLE table1 DROP COLUMN AttentionStatus;
ALTER TABLE table1 DROP COLUMN PreviousStatus;
CREATE VIEW vw_table1 AS (
SELECT
Id,
PatientName,
x.Attention as AttentionStatus,
y.Attention as PreviousStatus,
UpdatedDate
FROM table1
LEFT JOIN
(
SELECT PatientID,
ROW_NUMBER() OVER (PARTITION By PatientID ORDER By DATE DESC) as row,
Attention
FROM Table2
) x ON x.PatientID=table1.Id and x.row=1
LEFT JOIN
(
SELECT PatientID,
ROW_NUMBER() OVER (PARTITION By PatientID ORDER By DATE DESC) as row,
Attention
FROM Table2
) y ON y.PatientId=table1.Id AND y.row=2
);
Это создает представление с результатами, такими как:
ID | Имя пациента | Состояние внимания | Предыдущее состояние | Дата обновления |
---|---|---|---|---|
101 | Пациент 1 | Желтый | Красный | 2021-05-28 03:22:06.650 |
102 | Пациент 2 | Зеленый | Красный | 2021-05-26 14:29:52.620 |
Комментарии:
1. Эти поля необходимы, поскольку на таблицу ссылаются в отчетах.