Дело в обновлении заявления - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь перевести код календаря, который имеет вложенный оператор IF, в SQL

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

Логика от Talend Mapper:

   IF row32.DISPLAY_NAME_REPORTED IS NULL THEN
     IF row31.REPORTED_DISPLAY_NAME IS NULL THEN
       IF row87.SPEC_TYPE1 IS NULL THEN
         IF row87.SPEC_TYPE2 IS null THEN
           row34.Series
         ELSE
           row34.Series + row34.Type2
         END
       ELSE
         row34.Series + row34.Type2
       END
     ELSE
       row31.REPORTED_DISPLAY_NAME
     END
   ELSE
     row32.DISPLAY_NAME_REPORTED  
   END

Соответствующий регистр в SQL:

update a
        set a.seriesbt = case when exists (select 1 from  row32 x where 
           x.delivery_fk = a.delivery_fk) then
    case when b.delivery_fk is not null and 
                  b.DISPLAY_NAME_REPORTED is null then 
          case when c.reported_display_name is null then 
            case when d.SPEC_TYPE1 is null then
            case when d.SPEC_TYPE2 is null then
                    a.series 
                  else
                a.series+a.SPEC_TYPE2 end
            else a.series + a.SPEC_TYPE1 end 
             else c.reported_display_name end
        else b.DISPLAY_NAME_REPORTED end
    else a.series end
from tmpSales a 
left join row32 b on b.delivery_fk = a.delivery_fk 
left join row31 c  on c.DELIVERY_FK = a.delivery_fk 
left join row87 d on d.DELIVERY_FK = a.delivery_fk

Вопрос: правильно ли я перевел логику talend mapper в SQL? Если нет, подскажите, пожалуйста, в чем дело.
Должен ли я включить «когда существует» для каждой таблицы?
Я думал, что левое соединение должно неявно обрабатывать это.

1 Ответ

1 голос
/ 25 апреля 2019

Вы, кажется, добавили дополнительное условие, которого не было в вашем исходном коде. Кодирование наоборот может упростить задачу и избежать вложенных выражений CASE.

Я изменил псевдоним таблицы, чтобы было проще понять, откуда берутся столбцы, не возвращаясь к предложению FROM.

UPDATE s
SET a.seriesbt = CASE WHEN r32.DISPLAY_NAME_REPORTED IS NOT NULL THEN r32.DISPLAY_NAME_REPORTED
                      WHEN r31.reported_display_name IS NOT NULL THEN r31.reported_display_name
                      WHEN r87.SPEC_TYPE1 IS NOT NULL THEN s.series /*row34.Series*/ + s.SPEC_TYPE1
                      WHEN r87.SPEC_TYPE2 IS NULL THEN s.series  --row34.Series
                      ELSE s.series /*row34.Series*/ + s.SPEC_TYPE2 
                      END
FROM tmpSales s 
LEFT JOIN row32 r32 ON r32.delivery_fk = s.delivery_fk 
LEFT JOIN row31 r31 ON r31.DELIVERY_FK = s.delivery_fk 
LEFT JOIN row87 r87 ON r87.DELIVERY_FK = s.delivery_fk;

Я только что понял, что это можно упростить еще больше.

UPDATE s
SET a.seriesbt = COALESCE( r32.DISPLAY_NAME_REPORTED, 
                        r31.reported_display_name, 
                        s.series /*row34.Series*/ + s.SPEC_TYPE1, 
                        s.series /*row34.Series*/ + s.SPEC_TYPE2,
                        s.series  --row34.Series
                        )
FROM tmpSales s 
LEFT JOIN row32 r32 ON r32.delivery_fk = s.delivery_fk 
LEFT JOIN row31 r31 ON r31.DELIVERY_FK = s.delivery_fk 
LEFT JOIN row87 r87 ON r87.DELIVERY_FK = s.delivery_fk;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...