Как использовать «или» в условии слияния «КОГДА НЕ СОГЛАСОВАНО ПО ИСТОЧНИКУ» - PullRequest
0 голосов
/ 09 мая 2018

У меня есть следующее утверждение:

MERGE dbo.SystemCustomer As TARGET
USING (Select * 
       From dbo.vClients 
       Where ClientNumber Is Not Null) As SOURCE
    On TARGET.CustNumber = SOURCE.ClientNumber
WHEN MATCHED And (TARGET.DisplayCustNumber<>SOURCE.VisualID Or 
                  TARGET.CustName<>ISNULL(SOURCE.CustName,'') 
             And IsNull(SOURCE.VisualID,'') <> '' And IsNull(TARGET.DisplayCustNumber,'') <> ''
THEN Update Set TARGET.DisplayCustNumber = SOURCE.VisualID,
                TARGET.CustName = ISNULL(SOURCE.CustName,'')    
WHEN NOT MATCHED BY TARGET
THEN Insert (CustNumber, DisplayCustNumber, CustName)
     Values (SOURCE.ClientNumber, SOURCE.VisualID, ISNULL(SOURCE.CustName,''))  
WHEN NOT MATCHED BY Source --or IsNull(TARGET.DisplayCustNumber,'') = ''
THEN Delete;

Я хотел бы удалить записи, когда они не сопоставлены по источнику, и когда Target.DisplayCustNumber пусто или null (указано в комментарии после оператора "WHEN NOT MATCHED BY Source"), но, по-видимому, это невозможно по синтаксису. Как мне обойти это? Заранее спасибо!

1 Ответ

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

Я не могу на самом деле протестировать без определения вашей таблицы, но вы можете оставить свой WHEN NOT MATCHED BY SOURCE THEN DELETE и добавить еще WHEN MATCHED AND <condition> THEN DELETE.

MERGE dbo.SystemCustomer As TARGET
USING (Select * 
       From dbo.vClients 
       Where ClientNumber Is Not Null) As SOURCE
    On TARGET.CustNumber = SOURCE.ClientNumber
WHEN MATCHED And (TARGET.DisplayCustNumber<>SOURCE.VisualID Or 
                  TARGET.CustName<>ISNULL(SOURCE.CustName,'') 
             And IsNull(SOURCE.VisualID,'') <> '' And IsNull(TARGET.DisplayCustNumber,'') <> ''
THEN Update Set TARGET.DisplayCustNumber = SOURCE.VisualID,
                TARGET.CustName = ISNULL(SOURCE.CustName,'')   

WHEN MATCHED AND IsNull(TARGET.DisplayCustNumber,'') = '' THEN DELETE -- Add this line

WHEN NOT MATCHED BY TARGET
THEN Insert (CustNumber, DisplayCustNumber, CustName)
     Values (SOURCE.ClientNumber, SOURCE.VisualID, ISNULL(SOURCE.CustName,''))  
WHEN NOT MATCHED BY Source --or IsNull(TARGET.DisplayCustNumber,'') = ''
THEN Delete;

Существует несколько ограничений для нескольких операторов MATCHED, но они подходят для вашего случая (просто следите, если вы отредактируете его дальше):

Оператор MERGE может содержать не более двух предложений WHEN MATCHED. Если два пункты указываются, тогда первый пункт должен сопровождаться И пункт. Для любой данной строки второе предложение WHEN MATCHED только применяется, если первое нет. Если есть два предложения WHEN MATCHED, тогда нужно указать действие ОБНОВЛЕНИЕ и нужно указать УДАЛЕНИЕ действие. Если в предложении указано UPDATE, и более чем одна строка соответствует строка в target_table на основе, SQL Server возвращает ошибку. Оператор MERGE не может обновить одну и ту же строку более одного раза, или обновить и удалить ту же строку.

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