在teradata中使用案例陈述限定陈述

时间:2014-09-24 06:43:14

标签: sql teradata row-number

我正在尝试执行以下查询,该查询在qualify子句中有很多case语句。

insert into tab2 b
select  
      a.id,a.name
    from tab1 a
where a.country='US'
qualify(
       row_number() over(partition by a.university_id 
       order by 
       case when a.student_in_computerscience_fl='Y' then 1 else 0 end,
       case when a.student_in_chemistry_fl='Y' then 1 else 0 end,
       case when a.student_in_electronics_fl='Y' or a.student_in_physics_fl='Y' then 1 else 0 end,                 )=1)

包含大量案例陈述的合格证书是否会产生性能问题?

还是我必须使用临时表,我将等级(rk)存储为附加字段? 喜欢

insert into tmptab
select  
      a.id,a.name,
     row_number() over(partition by a.university_id 
       order by 
       case when a.student_in_computerscience_fl='Y' then 1 else 0 end,
       case when a.student_in_chemistry_fl='Y' then 1 else 0 end,
       case when a.student_in_electronics_fl='Y' or a.student_in_physics_fl='Y' then 1 else 0 end                 ) as rk
    from tab1 a
where a.country='US'

然后从上面提到的临时表插入最终目标表。

issert into tab2
(name,id)
select name,id from tmptab where rk=1

请分享您的意见。

1 个答案:

答案 0 :(得分:1)

第一个解决方案(QUALIFY)肯定应该比第二个解决方案更快(实现等级)。昂贵的操作有排名(ROW_NUMBER),你将在两种情况下都这样做。 使用第一个解决方案将避免做的是在tmptab的主索引上进行不必要的数据重新分配,在RowKey上排序(将不必要地发生 - 除非您正在写入NoPI表),然后从tmptab写入和读取数据。 您可以在QUALIFY子句中查看分析函数结果WHERE条件(ROW_NUMBER)。