【问题标题】:MySQL equivalent to MS SQL's Cross ApplyMySQL 相当于 MS SQL Cross Apply
【发布时间】:2015-10-01 18:05:23
【问题描述】:

如果您习惯了 MS SQL 的 Cross Apply,那么您可能想知道如何在 MySQL 中完成同样的事情。我找到了the reverse question,并认为这个直接的问题可以帮助任何想要搜索如何将此功能从 MS SQL 迁移到 MySQL 的人。

在此示例中,交叉应用允许您修改字段并在同一查询中使用结果。问题是如何在 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 中解决这个问题的最佳方法。
  • 那么请考虑为这个问题投票。

标签: mysql sql sql-server


【解决方案1】:

您对自己问题的回答表明了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 。 . .如果您不想要中间表,请使用视图。我不建议使用文档明确警告不要使用的“功能”。
  • 但是如果外部 Select 也是一个视图,这意味着有 2 个视图来满足所有需要,因为视图中不允许子查询。顺便说一句,为什么你认为视图比子查询更好?
  • @LWC 。 . . MySQL 实现子查询,但不实现视图。
  • @LWC 。 . .不,真的没有。它只是增加了查询的开销。在某些情况下它很有用(因此优化器应该能够在正确的情况下使用它),但是其他主要数据库(包括 Postgres 和 Hive 等免费数据库)不会自动实现 FROM 中的子查询子句。
【解决方案2】:

同样的事情可以(更新:虽然not ideally)通过用户定义变量(“at sign / @”)在MySQL中完成:

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

【讨论】:

  • 只是想知道。以后可以在WHEREGROUP BY条件下使用吗?
  • 这是不正确的。 MySQL 文档非常清楚 SELECT 的评估顺序未确定,因此此查询可能会出现意外行为。
  • @LWC 。 . .仅仅因为它在一个查询中起作用并不意味着它是正确或安全的。文档非常明确:“作为一般规则,除了在 SET 语句中,您永远不应该为用户变量赋值并在同一语句中读取值。”(dev.mysql.com/doc/refman/5.6/en/user-variables.html)。
  • APPLY 运算符的强大功能(顺便说一句,它已经成为 ANSI SQL 标准的一部分已有一段时间了,所以对 MySql 没有它感到羞耻)是当您想要多个列时应用的子查询;它允许数据库只需要为您想要带回的所有列运行一个子查询。此外,您可以将这些值用于连接、GROUP BY 和窗口函数(它们也是 ANSI 标准的一部分,MySql 也不支持)。真的,如果你想要一个开源数据库,MySql 多年来在几乎所有类别中都被 Postgresql 超越
  • MySQL 要做的一件事是它在 Google Cloud Platform 中可用。 ;-)
猜你喜欢
  • 2012-08-18
  • 2021-04-14
  • 2012-07-13
  • 2019-09-07
  • 2014-12-04
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
  • 2013-03-09
相关资源
最近更新 更多