首页 > 解决方案 > 在这种情况下如何解决 MySQL 错误“#1242 - 子查询返回超过 1 行”?

问题描述

SELECT SUM(`Total sale`) 
FROM `sales details` 
WHERE `Day` = "Sunday"
  AND `Shop ID` = (
    SELECT `Shop ID`
    FROM `shops` 
    WHERE `shops`.`Area Code` = (
      SELECT `Area Code` 
      FROM `distributors_areas` 
      WHERE `distributors_areas`.`Regional_Manager` = (
        SELECT `Name` 
        FROM `regional managers` 
        WHERE `regional managers`.`ID` = "REG_02"
      )
    )
  )

我想知道Total sale星期天在哪里,商店在区域经理“REG_02”的行政区域内。因此,我将周日销售的商店 ID 与属于“RM_02”的那些区域(区号)的商店 ID 进行了比较。shops表中有区域经理的名字,所以我将它们与regional managers表中的名字进行比较,得到“RM_002”的名字。

标签: mysqlsql

解决方案


简单的方法是使用IN

SELECT SUM(sd.`Total sale`)
FROM `sales details` sd
WHERE sd.`Day` = 'Sunday' AND
      sd.`Shop ID` IN
          (SELECT s.`Shop ID`
           FROM `shops` s
           WHERE s.`Area Code` IN
                     (SELECT da.`Area Code`
                      FROM `distributors_areas` da
                      WHERE da.`Regional_Manager` IN 
                             (SELECT rm.`Name`
                              FROM `regional managers` rm
                              WHERE rm.`ID` = 'REG_02'
                             )
                     )
          );

更明智的方法只是使用JOIN

SELECT SUM(sd.`Total sale`)
FROM `sales details` sd JOIN
     `shops` s
     ON sd.`Shop ID` = s.`Shop ID` JOIN
     `distributors_areas` da
     ON s.`Area Code` = da.`Area Code` JOIN
     `regional managers` rm
     ON  da.Regional_Manager = rm.Name
WHERE sd.Day = 'Sunday' AND
      rm.ID = 'REG_02';

笔记:

  • 使用作为表名缩写的表别名。这使查询更易于阅读和编写。
  • SQL标准字符串分隔符是单引号。你应该使用它。双引号有多种用途,因此它们是模棱两可的。
  • 对于只有字母、数字和下划线的标识符,无需使用反引号。它们只是使查询更难编写和阅读。
  • 避免在名称中使用空格等字符,因此您无需对名称进行转义。

推荐阅读