如何在 NETEZZA 中实现 CROSS APPLY?
Posted
技术标签:
【中文标题】如何在 NETEZZA 中实现 CROSS APPLY?【英文标题】:How to achieve CROSS APPLY in NETEZZA? 【发布时间】:2018-01-09 02:36:29 【问题描述】:我想分享我们如何在不使用 CROSS APPLY
的情况下实现功能。[适用于 NETEZZA
SQL
]。
以下查询使用交叉申请来检索每周 FOF 的最后 52 周:
SELECT t1.col,
t3.col AS col_last52wks
FROM TABLE1 t1
CROSS APPLY (
SELECT TOP 52 t2.col
FROM TABLE2 t2
WHERE t2.col <= t1.col
ORDER BY t2.col DESC
) t3
--Last 13 Weeks Condition
WHERE t1.col >= minvalue -- RANDOM
AND t1.col <= maxvalue-- RANDOM
我们可以通过在上面的代码中进行以下修改来实现这一点,并去掉CROSS APPLY
:
SELECT t1.col,
t2.col AS col_last52wks
FROM TABLE1 t1
INNER JOIN TABLE2 t2
ON t2.sequencecol BETWEEN (t1.sequencecol - 51) AND t1.sequencecol
WHERE t1.col >= minvalue
AND t1.col <= maxvalue
【问题讨论】:
Cross Apply
将从 t2
返回前 10 个 tradyrwkcode
,对于来自 t1
的每个 tradyrwkcode
。但是Cross Join
将只返回 10 条记录,无论有多少 tradyrwkcode
存在
如果我说 CROSS APPLY 的工作方式类似于 INNER JOIN 会错吗?
有点,但它们有自己的用途。外部表引用可以在 CROSS APPLY
子选择中引用,但在 Inner join
中您不能这样做。
这是唯一的区别还是还有其他区别?
还存在许多其他差异。谷歌它..
【参考方案1】:
我在这种情况下使用 CROSS APPLY:
当我 split 将一列数据分成多行并对该拆分后的数据进行“连接”时
一般的陈述如下
FROM Table1
CROSS APPLY dbo.UDF_TableFunctionName(Table1Column) as t
因此,如果您将字符串值传递给表函数,则可以简单地将其用作
select * from dbo.UDF_TableFunctionName(@strVariable)
但是如果你想在一个行集而不是单个值上使用这个函数,那么你使用 CROSS APPLY
CROSS APPLY 如果您想为行列返回多于 1 列,则很有用 例如,在这个table valued function 中,我将日期列解析为其日期部分并显示在同一行中
select
o.SalesOrderID, o.OrderDate,
d.[year], d.[month], d.[day]
from Sales.SalesOrderHeader o
cross apply dbo.udf_ParseDate(o.OrderDate) d
并且在 CROSS APPLY 上,您不使用 ON 之后的连接条件 您只需将列作为输入参数传递给表值函数
CROSS JOIN 只是两个表的笛卡尔坐标。 我们曾经在没有“CROSS JOIN”的情况下对其进行编码,如下所示
FROM TableA, TableB
【讨论】:
以上是关于如何在 NETEZZA 中实现 CROSS APPLY?的主要内容,如果未能解决你的问题,请参考以下文章
无法在 python 中实现 cross_validation