【问题标题】:How do you debug MySQL error 1242 (Subquery returns more than 1 row)?如何调试 MySQL 错误 1242(子查询返回超过 1 行)?
【发布时间】:2012-09-11 09:20:04
【问题描述】:

有没有办法让 MySQL 告诉在一个充满子查询的巨大自动生成查询中哪个子查询给出了上述错误?如果没有,您的调试策略是什么?

【问题讨论】:

  • 分而治之:从巨大的子查询中注释掉一半并运行。看看有没有错误。如果没有错误,删除 cmets 并注释掉另一半。如果错误仍然存​​在,则从一半的子查询中删除 cmets
  • @bpgergo:这对我来说似乎很脆弱。用常量值替换子查询(我认为这就是注释掉的意思)可能会导致某些连接不匹配,并且未注释掉的部分被优化掉;或者有问题的子查询可能与通过注释更改的值相关。因此,即使在注释掉某些内容后错误消失了,我也无法确定错误在哪里。
  • 是的,关于 WHERE 子句中的子查询,您是对的。出于某种原因,我认为子查询在 FROM 子句中。

标签: mysql debugging mysql-error-1242


【解决方案1】:

我将首先在查询和可能的子查询上使用 LIMIT 或 DISTINCT。 如果这不起作用,我将开始单独运行每个子查询,是的,这很耗时,但我发现它也有助于避免将来出现同样的问题。

【讨论】:

    【解决方案2】:

    查询示例:

    UPDATE direct_orders do
    SET do.dealer_id = (
        SELECT d.dealer_id FROM dealers d
        INNER JOIN dealer_addresses da 
            ON da.dealer_id = d.dealer_id
            AND da.type =  'M'
            AND da.status = 1
        INNER JOIN dealer_details dd 
            ON dd.dealer_id = d.dealer_id
            AND dd.status = 1
        WHERE ( da.address1 LIKE CONCAT(  '%', do.address1,  '%' ) AND do.postal LIKE da.postal_code ) 
        OR dd.name LIKE CONCAT(  '%', do.company,  '%' ) 
        AND do.dealer_id = 0
    )
    

    此查询失败,原因与发帖人相同。正确测试这一点的一种方法是执行以下操作(注意以前依赖于子关联的表的 LEFT JOIN):

    SELECT d.dealer_id FROM dealers d 
    LEFT JOIN direct_orders do
        ON do.dealer_id = 0
    INNER JOIN dealer_addresses da 
        ON da.dealer_id = d.dealer_id
        AND da.type =  'M'
        AND da.status = 1
    INNER JOIN dealer_details dd 
        ON dd.dealer_id = d.dealer_id
        AND dd.status = 1
    WHERE (da.address1 LIKE CONCAT(  '%', do.address1,  '%' ) AND do.postal LIKE da.postal_code ) 
    OR dd.name LIKE CONCAT(  '%', do.company,  '%' )        
    

    这样做表明实际上“direct_orders”表中的一条记录从“dealers”表中返回了多个“dealer_id”。

    【讨论】:

      猜你喜欢
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-05
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多