Как обновить таблицу с объединением и регистром в SQL Server? - PullRequest
0 голосов
/ 24 апреля 2019

у меня проблема при обновлении может таблица

    UPDATE FGJ
SET  
     [base_title]=
                        case when NL.[atypcode_type] = 105 THEN NL.[ATYPCODE] 
                        ELSE 0
                    END ,
     [base_mande]= 
                        case when  NL.[atypcode_type] = 105 and NL.[ATYPCODE]=FGJ.[base_title] 
                        THEN NL.[mande]+FGJ.[base_mande]
                        ELSE 0.00
                    END 
                    ,....



from [dbo].[SuratMali_FinalGozareshJame] FGJ
INNER JOIN #tmp_notLinked NL 
       ON FGJ.CodeL = NL.[codelfinal]

этот код не работает для таблицы обновления спасибо за прочтение моей проблемы

1 Ответ

0 голосов
/ 24 апреля 2019

CASE можно избежать, если вы разделите свое обновление на два обновления

UPDATE FGJ
SET  
     [base_title]= NL.[ATYPCODE] -- however, this case had different condition in your original query!
     [base_mande]= NL.[mande]+FGJ.[base_mande]
FROM [SuratMali_FinalGozareshJame] FGJ
INNER JOIN #tmp_notLinked NL 
       ON FGJ.CodeL = NL.[codelfinal]
WHERE NL.[atypcode_type] = 105 and NL.[ATYPCODE] = FGJ.[base_title] 


UPDATE FGJ
SET  
     [base_title]= 0 -- however, this case had different condition!
     [base_mande]= 0
FROM [SuratMali_FinalGozareshJame] FGJ
INNER JOIN #tmp_notLinked NL 
       ON FGJ.CodeL = NL.[codelfinal]
WHERE NL.[atypcode_type] != 105 or NL.[ATYPCODE] != FGJ.[base_title] 

Однако, как я упоминаю в коде, ваши условия case отличаются. Если это действительно так (не опечатка), то вы должны создать update для каждого условия.

Также можно переписать решение, которое inner join не указано явно, если вы используете подзапрос (см. Ниже). Это решение предполагает, что подзапрос возвращает только одно значение (например, если NL. [Codelfinal] является первичным ключом). Тем не менее, соединение все равно скрыто в синтаксисе, и нет смысла переписывать его так.

UPDATE FGJ
SET  
     [base_mande]= (
        SELECT NL.[mande]
        FROM #tmp_notLinked NL
        WHERE FGJ.CodeL = NL.[codelfinal] and 
              NL.[atypcode_type] = 105 and 
              NL.[ATYPCODE] = FGJ.[base_title] 
      ) + FGJ.[base_mande]
FROM [SuratMali_FinalGozareshJame] FGJ  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...