使用Teradata限制子查询中的行数

时间:2014-08-06 16:32:54

标签: sql subquery limit teradata

我是Teradata的新手,我遇到的问题与我之前使用的数据库没有关系。 基本上,我正在尝试减少where子句中子查询中返回的行数。使用ROWNUM函数我之前没有遇到任何问题。

我之前的查询类似于:

SELECT * FROM myTable
WHERE field1 = 'foo' AND field2 in(
    SELECT field2 FROM anotherTable
    WHERE field3 = 'bar' AND ROWNUM<100);

由于我不能在TD中使用ROWNUM,我已经找到了等效的功能或至少可以让我获得我想要的功能,即使它们并非完全相同。 我找到并尝试了:ROW_NUMBER,TOP和SAMPLE。

我尝试了ROW_NUMBER(),但Teradata不允许在WHERE子句中使用分析函数。 我尝试过TOP N但子查询中不支持此选项。 我尝试了SAMPLE N,但子查询也不支持。

所以...我不得不承认我现在有点卡住了,并且想知道是否有任何解决方案可以让我限制使用Teradata在子查询中返回的行数,这将非常类似于我到现在为止做了什么? 另外,如果没有,那么如何以不同的方式构建查询以便在Teradata中正确使用它?

谢谢!

1 个答案:

答案 0 :(得分:3)

子查询中SAMPLE或TOP的使用受限可能是因为这可能是相关子查询。

但有两种解决方法。

将SAMPLE或TOP放在子查询中的派生表中(这样就不再相关了):

SELECT * FROM myTable
WHERE field1 = 'foo'
AND field2 IN (
     SELECT * FROM
       ( SELECT field2 FROM anotherTable -- or TOP 100
         WHERE field3 = 'bar'  SAMPLE 100
       ) AS dt
    );

或者将其重写为派生表的连接:

SELECT * FROM myTable
JOIN ( SELECT DISTNCT field2 FROM anotherTable -- can't use TOP if you need DISTINCT 
         WHERE field3 = 'bar' SAMPLE 100
       ) AS dt
WHERE field1 = 'foo'
AND myTable.field2 = dt.field1;

没有ORDER BY的TOP与ROWNUM非常相似。它根本不是随机的,但是第二次运行它可能仍会返回不同的结果集。

每次返回不同的结果时,SAMPLE都是随机的。

使用QUALIFY而不是WHERE也可以使用ROW_NUMBER,但是OLAP函数总是需要一些ORDER BY,因此开销要大得多。