Cha*_*les 5 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);
Run Code Online (Sandbox Code Playgroud)
因为我不能在 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
);
Run Code Online (Sandbox Code Playgroud)
或者将其重写为与派生表的连接:
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;
Run Code Online (Sandbox Code Playgroud)
没有 ORDER BY 的 TOP 与 ROWNUM 非常相似。它根本不是随机的,但第二次运行它可能仍会返回不同的结果集。
SAMPLE 是真正随机的,每次返回不同的结果。
ROW_NUMBER 也可以使用 QUALIFY 而不是 WHERE,但 OLAP 函数总是需要一些 ORDER BY,因此开销更大。