mysql - 在这种情况下如何解决 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”的名字。
解决方案
简单的方法是使用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标准字符串分隔符是单引号。你应该使用它。双引号有多种用途,因此它们是模棱两可的。
- 对于只有字母、数字和下划线的标识符,无需使用反引号。它们只是使查询更难编写和阅读。
- 避免在名称中使用空格等字符,因此您无需对名称进行转义。
推荐阅读
- php - 使用 Apache 和 Kohana 创建 PHP 服务器
- sas - 使用数据步骤中的 put 语句写入 SAS EG 中的默认 HTML 输出
- reactjs - 将选定的值保留在 React 的一组单选按钮中
- html - 由于全宽行,引导 4 网格空白
- javascript - Sequelize 模型关联不会创建新列
- csv - Wix:在 UI 序列中读取文本文件
- php - php @chdir 文件未找到
- django - 如何在石墨烯解析器中调用 django 模型函数?
- pandas - 如何在熊猫中使用 crosstab .plot() 绘制图表中的轴顺序?
- flutter - Flutter YouTube 视频嵌入