是否可以用连接替换交叉应用?
Posted
技术标签:
【中文标题】是否可以用连接替换交叉应用?【英文标题】:Is it possible to replace a cross apply with a join? 【发布时间】:2019-06-12 14:38:03 【问题描述】:我正在对一些遗留的 SQL 算法进行逆向工程以迁移到 apache spark。
我遇到了一个跨应用程序,我知道它是特定于 TSQL 的,并且在 ANSII 或 Spark SQL 中没有直接等效项。
净化后的算法是:
SELECT
Id_P ,
Monthindex ,
(
SELECT
100 * (STDEV(ResEligible.num_valid) / AVG(ResEligible.num_valid)) AS Pre_Coef_Var
FROM
tbl_p a CROSS APPLY
(
SELECT
e.Monthindex ,
e.num AS num_valid
FROM
dbo.tbl_p e
WHERE
e.Monthindex = a.MonthIndex
AND e.Id_P = a.Id_P
UNION ALL
SELECT DISTINCT
B1.[MonthIndex ] ,
Tr.num AS num_valid
FROM
#tbl_pr B1
INNER JOIN
#tbl_pr B2
ON
B1.[Id_P] = B2.[Id_P]
AND B2.Rang - B1.Rang BETWEEN 0 AND 2
INNER JOIN
dbo.tbl_p Tr
ON
Tr.Id_P = B1.Id_P
AND Tr.Monthindex = B1.Monthindex
WHERE
a.Id_P = B1.[Id_P]
AND B2.[MonthIndex] =
(
SELECT
MAX([MonthIndex])
FROM
#tbl_pr
WHERE
[MonthIndex] < a.MonthIndex
AND [Id_P] = a.Id_P) ) AS ResEligible
WHERE
a.Id_P = result.Id_P
AND a.MonthIndex = result.MonthIndex) AS Coeff
FROM
tbl_p AS result
WHERE
1 = 1
AND MonthIndex = @CurrentMonth
GROUP BY
Id_P ,
Monthindex) AS CC
所以对于别名 b 中的每一行,我们交叉应用到内部查询。
是否可以根据连接操作(或其他方式)重写交叉应用,以便我可以在 spark sql 中重新实现?
干杯
特里
【问题讨论】:
可能。APPLY
没有 ON
与 JOIN
一样(除了 CROSS JOIN
),因此您需要移动部分子句,但我们没有您的查询可以在这里为您提供帮助。
"但是我们没有您的查询的“肉”来帮助您。" 我认为@Larnu 的意思是在这里告诉Why should I provide a Minimal Reproducible Example for a very simple SQL query?
我认为Spark
与cross apply
有问题?也许一个简单的解决方案可能是创建一个包含此查询的View
,然后只需执行select col1, ... from myView
从而有效地从火花中隐藏交叉应用
Spark 不支持交叉应用
Exa,ple 已更新以显示示例交叉应用表达式
【参考方案1】:
似乎您可以将查询重写如下:
SELECT T1.col1,
T1.col2,
sq.col3Sum
FROM tbl1 T1
CROSS JOIN (SELECT SUM(T1sq.Col3) AS col3Sum
FROM tbl1 T1sq
JOIN tbl2 T2 ON T1sq.Col1 = T2.Col2
JOIN tbl3 T3 ON T2.col1 = T3.Col1) sq;
然而,在对 tbl1
的两次引用之间没有 JOIN
标准似乎很奇怪。
【讨论】:
以上是关于是否可以用连接替换交叉应用?的主要内容,如果未能解决你的问题,请参考以下文章