Оператор слияния с проверкой по дате и проверкой наличия значения - PullRequest
0 голосов
/ 07 мая 2020
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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...