如何将以下查询(oracle)中的rownum转换为等效的teradata:
and not exists(select 1
from CSE, SPD
WHERE cse.id=spd.id
AND ROWNUM = 1
AND CSE.STATUSID IN(6,7,8,13)
感谢。
答案 0 :(得分:2)
Teradata中没有ROWNUM,但您通常可以使用ROW_NUMBER和QUALIFY重写它。
在你的情况下,根本不需要ROWNUM(至少在逻辑上,也许Oracle更喜欢它做一个更好的计划),这是完全一样的:
and not exists(select *
from CSE, SPD
WHERE cse.id=spd.id
AND CSE.STATUSID IN(6,7,8,13)
答案 1 :(得分:2)
Teradata特别没有像Oracle中那样附加到表中的行的任何rownumber。
但它有两个分析函数,如ROW_NUMBER()和RANK(),它们会为你的行提供一个数字,然后你可以相应地选择数据。
您可以使用以下内容:
QUALIFY ROW_NUMBER()(按日期按ID顺序分区)= 1
此处,可以使用一列或几列分区来对数据进行分组,例如假设表中的某个id列和order by将根据您提供的列的顺序对表中该ID的数据进行排序和= 1表示然后选择该行的行,该行的行号为1。
答案 2 :(得分:1)
使用如下所示的东西:
row_number() over(partition by '' order by statusid asc) as rownum_1
qualify rownum_1 = 1
上述声明模仿了oracle的rownum功能。
答案 3 :(得分:0)
你可以使用row_number。在计算行号时请记住要考虑的列。您可以使用相同的资格。 其他选项是dense_rank,rank等。在你的情况下,你可以在子查询中使用rank并将条件rank = 1.如果你想要语法,请告诉我。
答案 4 :(得分:0)
当你使用这个调整来提高效率时,我想,QUALIFY ROW_NUMBER()和其他窗口函数在大量使用CPU期间不会让你失望。
你可以简单地删除这部分,Teradata应该没问题。