我是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正确配合使用的方式有所不同?
谢谢!
子查询中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实际上是随机的,每次返回不同的结果。
ROW_NUMBER也可以使用QUALIFY代替WHERE,但是OLAP函数始终需要一些ORDER BY,因此开销更大。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句