是否可以用连接替换交叉应用?

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 没有 ONJOIN 一样(除了 CROSS JOIN),因此您需要移动部分子句,但我们没有您的查询可以在这里为您提供帮助。 "但是我们没有您的查询的“肉”来帮助您。" 我认为@Larnu 的意思是在这里告诉Why should I provide a Minimal Reproducible Example for a very simple SQL query? 我认为Sparkcross 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 标准似乎很奇怪。

【讨论】:

以上是关于是否可以用连接替换交叉应用?的主要内容,如果未能解决你的问题,请参考以下文章

visio 交叉线 不出现拱形怎么办?

使用内连接,左外连接,交叉应用获取语法错误与 Where 子句

为啥交叉应用比内连接快?

MS SQL 交叉连接性能评估

用逗号分隔表的查询是交叉连接查询吗?

win10下的用交叉线实现文件共享