更新声明中的案例

时间:2019-04-25 19:48:57

标签: sql sql-server

我正在尝试将具有嵌套IF语句的talend代码转换为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中对应的case语句:

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映射器逻辑正确转换为SQL?如果没有的话,能告诉我是什么问题。
我应该为每个表添加“ when exist”吗?
我认为左联接应该隐式处理它。

1 个答案:

答案 0 :(得分:1)

您似乎添加了原始代码中没有的其他条件。相反的编码方式可以使事情变得更简单,并避免使用嵌套的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;