【问题标题】:Limiting the number of rows in subqueries with Teradata使用 Teradata 限制子查询中的行数
【发布时间】:2014-09-29 16:38:02
【问题描述】:

我是 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 一起使用?

谢谢!

【问题讨论】:

    标签: sql subquery limit teradata


    【解决方案1】:

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

    【讨论】:

    • 非常感谢,第一个效果很好!我也有类似的查询,但它是 UPDATE 而不是 SELECT。所以我尝试应用相同的想法,但显然在 UPDATE 语句中不允许派生表......知道如何使用 UPDATE 使类似的东西工作吗?
    • 使用派生表进行更新的语法是 UPDATE tab FROM (SELECT ...) AS dt SET ... WHERE ...
    • 我想这就是我尝试过的:UPDATE dt FROM ( SELECT TOP 100 * FROM myTable WHERE field1='value' ) AS dt SET field2 = 'foo', field3 = 'bar'; 但我仍然收到语法错误:“派生表不允许更新。”
    • 您无法更新派生表,请尝试 UPDATE myTable FROM (SELECT TOP 100 * FROM myTable WHERE field1='value') AS dt SET field2 = 'foo', field3 = ' bar' WHERE join-between-myTable-and-dt
    • 哦,好吧,现在在我看来更有意义了!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 2013-07-14
    • 2019-02-13
    • 2015-11-11
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    相关资源
    最近更新 更多