Как выполнить несколько обновлений в одном операторе слияния - PullRequest
0 голосов
/ 30 мая 2019

Мне нужно обновить несколько столбцов в одном операторе слияния с двумя различными условиями, такими как 1. row_ind = N; обновить некоторые столбцы
2. row_ind = Y; обновить некоторые столбцы

Как я добьюсь этого в sqlserver / oracle

WHEN MATCHED THEN
UPDATE SET TARGET.NodeId = SOURCE.StartNodeId,
           TARGET.LinkId = SOURCE.Id where row_ind ='Y'

UPDATE SET TARGET.NodeId = SOURCE.EndNodeId,
           TARGET.LinkId = SOURCE.Id where row_ind = 'N';

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Вы можете использовать "CASE..WHEN" для достижения того же в Oracle следующим образом:

WHEN MATCHED THEN UPDATE SET TARGET.NODEID = CASE ROW_IND
    WHEN 'Y'   THEN SOURCE.STARTNODEID
    WHEN 'N'   THEN SOURCE.ENDNODEID
END,
TARGET.LINKID = SOURCE.ID;

Спасибо

1 голос
/ 30 мая 2019

Для TSL вы можете попробовать использовать AND <clause_search_condition>

MERGE   
    [ TOP ( expression ) [ PERCENT ] ]   
    [ INTO ] <target_table> [ WITH ( <merge_hint> ) ] [ [ AS ] table_alias ]  
    USING <table_source>   
    ON <merge_search_condition>  
    [ WHEN MATCHED [ AND <clause_search_condition> ]     <==
        THEN <merge_matched> ] [ ...n ]  
<merge_matched>::=  
     { UPDATE SET <set_clause> | DELETE } 

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

WHEN MATCHED AND row_ind ='Y' THEN
UPDATE SET TARGET.NodeId = SOURCE.StartNodeId,
           TARGET.LinkId = SOURCE.Id 
WHEN MATCHED AND row_ind ='N' THEN
UPDATE SET TARGET.NodeId = SOURCE.EndNodeId,
           TARGET.LinkId = SOURCE.Id ;

в oracle вы не можете сделать это, так как разрешен только один merge_update_clause

MERGE не поддерживается MySQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...