我想分享我们如何在不使用它的情况下实现CROSS APPLY
功能。[适用于NETEZZA
SQL
]。
以下查询使用交叉申请每周回顾最后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:
当我将列数据split分成多行并在此分割数据上“加入”时
这些陈述一般如下
FROM Table1
CROSS APPLY dbo.UDF_TableFunctionName(Table1Column) as t
因此,如果要将字符串值传递给表函数,则可以将其简单地用作表函数
select * from dbo.UDF_TableFunctionName(@strVariable)
但是如果要在行集而不是单个值上使用此函数,则使用CROSS APPLY
如果要为行列返回多于1列,则CROSS APPLY非常有用例如,在此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