Ask
do not want to add is_selected 0 when row does not exist and want to add is_selected 0 when any previous date has an entry is_selected 1 for the same field value and field id
опций испробовано Если я изменю НЕ СОГЛАСОВАН на НЕ СООТВЕТСТВУЕТ И IS_SELECTED = 1, то приведенный ниже сценарий обновления завершится ошибкой при field_value 26, потому что значение поля 26 имеет is_selected 0, а дата отличается от @ date.
Если я удалю условие даты, оно обновит существующую строку вместо добавления новой строки 8 мая в сценарии обновления.
Я пробовал много вариантов, добавляя / удаляя условие в операторе слияния. Я не смог добиться всего и создания, и сценария. Любая помощь приветствуется.
Create:
DECLARE @date DATE
SET @date = '05/01/2020 00:00:00'
@cf_values in the query
User_id field_id type_id field_value is_selected
1 14 11 25 1
1 14 11 26 0
Table2 (Expected) – no rows initially for this user
User_id Date field_id type_id field_value is_selected
1 2020-05-01t 14 11 25 1
Update based on the value given or field value exist on earliest Previous Date
DECLARE @date DATE
SET @date = '05/08/2020 00:00:00'
@cf_values in the query
User_id field_id type_id field_value is_selected
1 14 11 25 0
1 14 11 26 1
1 14 11 27 1
1 14 11 29 0
Table2 (Existing Value )
User_id Date field_id type_id field_value is_selected
1 2020-05-01t 14 11 25 1
1 2020-05-01t 14 11 26 0
1 2020-05-01t 14 11 28 1
Table2 (Expected )
User_id Date field_id type_id field_value is_selected
1 2020-05-01t 14 11 25 1
1 2020-05-01t 14 11 26 0
1 2020-05-01t 14 11 28 1
1 2020-05-08t 14 11 25 0
1 2020-05-08 14 11 26 1
1 2020-05-08 14 11 27 1
DECLARE @user_id INT
SET @user_id = 1
DECLARE @date DATE
SET @date = '05/01/2020 00:00:00'
DECLARE @cf_values tt_user_custom_field_v2_multi
INSERT INTO @cf_values (user_id, field_id, type_id, field_value_lookup, is_selected)
VALUES (1, 14, 11, 25, 'true');
INSERT INTO @cf_values (user_id, field_id, type_id, field_value_lookup, is_selected)
VALUES (1, 14, 11, 26, 'false');
; BEGIN TRY
BEGIN TRANSACTION;
DECLARE @as_of_cfs TABLE
(
date [datetime],
field_id INT,
type_id INT,
field_value_lookup INT,
is_selected BIT
)
; WITH data AS
(
SELECT t2.date,
ed.field_id,
ed.type_id,
ed.field_value_lookup,
ed.is_selected,
ROW_NUMBER() OVER (PARTITION BY t2.field_id, t2.field_value_lookup ORDER BY date DESC) 'rownum'
FROM table2 t2
WHERE t2.user_id = @user_id
AND t2.date <= @date
)
INSERT INTO @as_of_cfs(date, field_id, type_id, field_value_lookup, is_selected)
SELECT date, field_id, type_id, field_value_lookup, is_selected
FROM data
WHERE rownum = 1
; MERGE table2 AS t
USING (SELECT v.[user_id], v.[field_id], v.[type_id], v.[field_value_lookup], v.[is_selected]
FROM @cf_values v
LEFT JOIN @as_of_cfs a ON v.field_id = a.field_id and v.field_value_lookup = a.field_value_lookup
WHERE cf.type_id = 11
AND [user_id] = @user_id
AND (
(v.field_value_lookup IS NOT NULL AND a.field_value_lookup <> v.field_value_lookup)
OR (a.is_selected <> v.is_selected OR a.is_selected IS NOT NULL AND v.is_selected IS NULL OR a.is_selected IS NULL AND v.is_selected IS NOT NULL))
) AS s
ON (t.[user_id] = s.[user_id] AND t.[field_id] = s.[field_id] AND t.[field_value_lookup] = s.[field_value_lookup] AND t.[date] = @date)
WHEN MATCHED THEN
UPDATE SET [field_value_lookup] = s.[field_value_lookup], [is_selected] = s.[is_selected]
WHEN NOT MATCHED THEN
INSERT([user_id], [date], [field_id], [type_id], [field_value_lookup], [is_selected])
VALUES(s.[user_id], @date, s.[field_id], s.[type_id], s.[field_value_lookup], s.[is_selected])
;
END
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
THROW
END CATCH;