在 SELECT 子查询中引用派生 Table

Refer to a Derived Table in a SELECT Subquery

在下面的代码中,产生的错误是“对象 t 不存在”。 T 是 FROM 中定义的派生 table。我不想在 SELECT 子查询中重新过滤,而是想使用派生的 table 来节省处理时间。由于FROM是按操作顺序先处理的,所以我觉得应该有办法让我在SELECT.

中引用"t"

(我在 Teradata 以防万一)

SELECT (100000/(SELECT COUNT(DISTINCT EXTRACT(DAY FROM t.saledate))
        FROM t
        WHERE EXTRACT(MONTH FROM t.saledate) = 11)) as "NOVEMBER"
FROM (SELECT sprice, quantity, sku, store, saledate
        FROM trnsact
        WHERE (saledate BETWEEN '2004-11-01' AND '2004-12-31')
            ) as t

如果您使用的是 SQL 服务器,您会这样做:

;WITH t as
SELECT sprice, quantity, sku, store, saledate
        FROM trnsact
        WHERE (saledate BETWEEN '2004-11-01' AND '2004-12-31')
SELECT (100000/(SELECT COUNT(DISTINCT EXTRACT(DAY FROM t.saledate))
        FROM t
        WHERE EXTRACT(MONTH FROM t.saledate) = 11)) as "NOVEMBER"

我认为可以对查询进行更多改进,但这是一个好的开始。

我们可以使用内联视图或常见的 table 表达式来实现结果(看起来就像您想要的那样)。作为使用内联视图的示例:

SELECT ( 100000
       / COUNT(DISTINCT
           CASE WHEN EXTRACT(MONTH FROM t.saledate) = 11 
                THEN EXTRACT(DAY FROM t.saledate)
                ELSE NULL
           END
         )
       ) AS "NOVEMBER"
FROM ( SELECT r.sprice
            , r.quantity
            , r.sku
            , r.store
            , r.saledate
         FROM trnsact r
        WHERE r.saledate BETWEEN '2004-11-01' AND '2004-12-31'
     ) t

我还想避免任何潜在的 "divide by zero" 错误,所以我将 COUNT() 表达式包装在 NULLIFZERO 函数中。


我们会注意到,对于该结果集,我们实际上不需要内联视图或 CTE。它可以通过更简单的查询来实现:

SELECT ( 100000
       / NULLIFZERO(COUNT(DISTINCT EXTRACT(DAY FROM t.saledate)))
       ) AS "NOVEMBER"
  FROM trnsact t
 WHERE t.saledate >= '2004-11-01'
   AND t.saledate <  '2004-12-01'