Будет ли "левая таблица соединений на identif_key = null" справочной скоростью запроса? - PullRequest
0 голосов
/ 05 мая 2018

Существует три таблицы: две восходящие table A and B и одна нижняя table C. Записи в table A and B обрабатываются и объединяются в table C.

Table A ( id_a identity not null, prop, val )
Table B ( id_b identity not null, prop, val )
Table C ( id_c, 
    original_id [id_a or id_c],
    prop, processed_val, 
    source_table [ 'A' or 'B' ] )
NOTE: id_a and id_b has different format they never collide.

Мне нужно исправить поведение некоторых приложений без доступа к коду приложения. поэтому я пытаюсь прикрепить триггер на table C и манипулировать process_val в зависимости от исходных данных.

Я мог бы сделать

UPDATE C 
SET processed_value = NEW_FUNCTION( coalesce(A.val,B.val) )
FROM inserted
LEFT JOIN A ON ( C.orginal_id = A.id )
LEFT JOIN B ON ( C.orginal_id = B.id )

Но я думаю, что для того, чтобы вернуть результат, придется пройти через индекс двух таблиц. Я не хочу использовать динамический запрос, я хочу, чтобы он был простым как процедура sql.

Интересно, поможет ли sth, как показано ниже, предотвратить поиск избыточности, поскольку эти ключи не должны быть NULL, будет ли значение NULL останавливать поиск?

UPDATE C 
SET processed_value = NEW_FUNCTION( coalesce(A.val,B.val) )
FROM inserted
LEFT JOIN A ON ( A.id = case when source_table='A' then C.orginal_id else NULL end )
LEFT JOIN B ON ( B.id = case when source_table='B' then C.orginal_id else NULL end )

Или в MSSQL есть другой способ динамического переключения исходной таблицы (без динамического запроса)?

1 Ответ

0 голосов
/ 05 мая 2018

Я думаю, вы хотите JOIN между C и inserted. Я ожидаю, что логика будет выглядеть примерно так:

UPDATE C 
    SET processed_value = NEW_FUNCTION(coalesce(A.val, B.val))
    FROM inserted i JOIN
         C
         ON i.id_c = C.id_C LEFT JOIN
         A
         ON A.id = i.original_id AND i.source_table = 'A' LEFT JOIN
         B
         ON B.id = C.orginal_id AND i.source_table = 'B';
...