相当新的MySQL。
慢速查询会占用整个硬盘空间,最终会出现1030错误代码。
INSERT INTO schema.Table C
SELECT a.`Date`, a.Store, a.SKU,
floor((a.QTY / ((b.CASEQTY * b.CASEPERLAYER) * b.LAYERPERPALLET))) AS Pallets,
floor(((a.QTY / ((b.CASEPERLAYER * b.LAYERPERPALLET) * b.CASEQTY)) /.CASEQTY)) AS Cases,
(a.QTY * b.CASEQTY) AS Pieces
FROM
(schema.table1 AS a
INNER JOIN schema.table2 AS b)
WHERE a.Description = 'BLAH';
问题:
当我运行上述查询时,我得到了我需要的结果,在0.01秒内限制为100行。但是,当我尝试将查询插入准备好的表时,它会失败。
上述查询基本上会运行几个小时,直到硬盘已满。表A包含数百万条记录,表B仅包含数千条记录。存储引擎是InnoDB。我已经运行了3小时的类似查询并且已经成功了。任何帮助将不胜感激。
答案 0 :(得分:2)
这在MySQL中很特别。尽管称之为 INNER JOIN ,但您可以通过省略ON子句来执行 CROSS JOIN ,这正是您正在做的事情。 (另一个dbms会引发语法错误。)
因此,如果不指定ON子句来匹配table1和table2中的记录,则将table1中的每个记录与table2中的每个记录进行匹配。这可能很多: - )
答案 1 :(得分:0)
您的内部联接语句不包含联接条件。这将导致一些(坏的)称为“笛卡尔积”"。因此,如果表A有一百万条记录而表b包含一千条,那么笛卡尔积将匹配表A中的每一行到另一个表中的每一行。这应该给你(至少)十亿条记录。
要解决此问题,您需要使用" ON"来定义/约束两个表之间的关系。您的联接的子句或它可以在WHERE子句中。