【问题标题】:oracle query to mysql left joinsoracle查询mysql左连接
【发布时间】:2012-01-20 20:46:34
【问题描述】:

我将公司的 oracle 数据库迁移到 mysql(是的,不要问我为什么),很少有查询(用于报告)很大并且在 mysql 中工作

其中一个是 4021 行,包含 89 个 INNER JOIN

这会为公司客户生成一份完整的去年财务详细报告。

我需要这份报告(因为我们很快就要到年底了)为 2011 年工作,我在许多网站上看到 mysql 的最大左连接数是 60 左连接数。

我被这份报告搞砸了吗?还是有办法让我运行它?

【问题讨论】:

  • 如果您因为报告涵盖新的一年而需要新联接,则您的数据模型可能不正确。

标签: mysql left-join


【解决方案1】:

我认为您的报告查询无论如何都会在 EXPLAIN 中产生using temporary。您可以在事务中将单个查询拆分为多个查询,并显式创建临时表。

如果您的 Oracle 查询包含命名子查询(我的意思是来自 T-SQL 的 WITH 子查询,我不知道它们是否存在于 Oracle 中,但绝对不存在于 MySQL 中),这可能会更有帮助。

【讨论】:

  • CTE 存在于普通数据库中,但 mysql :))) 。即使在 mysql 中,分配给临时表的空间也是有限的,你也应该考虑一下 :))
【解决方案2】:

您必须向上(或向下,取决于您的观点)跳转到一种编程语言(Ruby、PHP、Python 等)来解决这个问题,只需使用本机对象而不是仅仅依靠一个巨大的连接。

你是对的,MySQL 的最大连接数是 61(http://dev.mysql.com/doc/refman/5.0/en/joins-limits.html

【讨论】:

  • 你提供的链接说JOIN语句中可以引用的表的最大数量是61,而不是任何一个查询中JOINs的最大数量是61。
【解决方案3】:

如果是这种情况,您可能想尝试将查询分解一些,并在可行的情况下获取一些预查询的“左连接”内容以及其他一些元素。例如,您可以预先查询(并且只是猜测)

具有总帐科目代码(id 列)等类别的库存项目作为一个预查询。

将所有订单详细信息加入到订单标题摘要以获取客户 ID 并作为另一个预查询加入客户。确保将所有关键要素加入到整体报告要求中。

在可能的情况下继续向下列表,您可能会杀死一堆,因为它们将是 SUBQueries 的结果,其中没有一个级别会进行 61 个连接。

【讨论】:

    【解决方案4】:

    使用枚举类型,这将使​​您免于痛苦的左连接

    如果您的表很少,您只需使用 enum 即可删除,这是一个很大的改进。

    特别是你有什么样的数据

    【讨论】:

      猜你喜欢
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 2012-08-31
      • 1970-01-01
      相关资源
      最近更新 更多