MySQL中与MS SQL的Cross Apply相当的功能是什么?

3
如果您已经熟悉了 MS SQL 的 Cross Apply,那么您可能会想知道如何在 MySQL 中完成相同的操作。我找到了相反的问题,并认为这个直接的问题可能会帮助任何想要搜索如何将此功能从 MS SQL 迁移到 MySQL 的人。
在这个例子中,Cross Apply 允许您修改一个字段并在同一个查询中使用结果。问题是如何在 MySQL 中实现这一点。
SELECT v.Var1, POWER(v.Var1, 2) AS Var2Squared
    FROM [Table] t
    CROSS APPLY (SELECT t.Column1 + t.Column2 AS Var1) v

我发现CROSS APPLY在基于另一个表的最大或最小值进行连接时特别有用。目前,我正在为在MySQL中解决此问题的最佳方法苦苦思索(打个比方)。 - Stewart
那请考虑为这个问题投票。 - LWC
2个回答

2
你对自己的问题的回答表明了 CROSS APPLY 所做的非常有限的子集。对于这个特定的问题,你可以使用一个子查询:
select t.*, power(var1, 2)
from (select (column1 + column2) as var1
      from aTable
     ) t;

这种方法更加昂贵,因为它需要将子查询实例化。另一种选择是重复表达式:
select (column1 + column2) as var1, power((column1 + column2), 2)
from aTable;

这是我能立即想到的MySQL中唯一安全的方法来实现你想要的目标。

就像你自己说的那样,这更加昂贵。此外,“power(var1,2)”只是一个例子。想象一下使用包括情况等更复杂公式实现重复的情况。 - LWC
@LWC……如果您不想使用中间表,请使用视图。我不建议使用文档明确警告不要使用的“功能”。 - Gordon Linoff
但是,如果外部Select也是一个视图,这意味着对于需要它的所有内容都需要有两个视图,因为子查询在视图中不被允许。顺便问一下,您认为视图比子查询更好吗? - LWC
@LWC...MySQL将子查询实例化,但不将视图实例化。 - Gordon Linoff
除了需要两个视图之外,为什么最好不要有子查询呢?材料化没有作用吗? - LWC
1
@LWC...实际上并不是这样的。它只会增加查询的开销。在某些情况下,它是有用的(因此优化器应该能够在适当的情况下使用它),但其他主要数据库(包括免费的Postgres和Hive)不会自动将子查询材料化到“FROM”子句中。 - Gordon Linoff

0

尽管 不太理想, 在 MySQL 中也可以通过用户定义变量("at sign / @")实现同样的功能:

SELECT @var1 := column1+column2 AS var1,
  POWER(@var1, 2) AS var2squared
  FROM aTable

1
只是想知道,它是否可以在WHEREGROUP BY条件中稍后使用? - Evaldas Buinauskas
这是不正确的。MySQL文档非常清楚地说明SELECT的评估顺序是不确定的,因此这个查询可能会有意外的行为。 - Gordon Linoff
@LWC...仅仅因为一条查询能够运行成功,并不代表它是正确或安全的。文档已经明确指出:“一般来说,在SET语句以外,您不应该在同一语句中赋值给用户变量并读取该值。”(https://dev.mysql.com/doc/refman/5.6/en/user-variables.html) - Gordon Linoff
2
APPLY运算符的威力(顺便说一句,它已经成为ANSI SQL标准的一部分有一段时间了,所以MySql没有它真是可惜)在于当您想要从应用子查询中获取多个列时;它允许数据库只需要运行一个子查询来获取您想要带回的所有列。此外,您可以将这些值用于诸如连接、GROUP BY和窗口函数之类的操作(这些也是ANSI标准的一部分,而MySql仍然不支持)。实际上,如果您想要一个开源数据库,多年来Postgresql在大多数方面都已经超越了MySql。 - Joel Coehoorn
MySQL的一个优点是它是Google Cloud平台上可用的。;-) - LWC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接