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

标签 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 中正确使用它?

谢谢!

最佳答案

子查询中 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,因此开销要大得多。

关于sql - 使用 Teradata 限制子查询中的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25165544/

相关文章:

sql - Rails : complex search on 3 models, 只返回最新的 - 如何做到这一点?

sql - 如何根据 r 中的另一个键/ID 列将列切换为行?

iphone - 如何限制iPhone中的解析?

postgresql - 是否可以将 LIMIT 子句分发给子查询?

html - 如何在 CSS 中将最大宽度和高度限制为屏幕尺寸?

sql - 在SQL Server中并行执行3条SQL语句

java - 是否可以选择 SQL 中的所有列但只选择每第三行?

oracle - 如何在 Oracle SQL 中使用相同的子查询更新同一个表中的多个列

mysql - 如何为 MySQL 中的字段或列设置别名?

mysql - mysql 连接子查询和限制的性能