MySQL使用REPLACE嵌套子查询报1242子查询返回多行错误如何解决
问题排查
- 第一次报错原因:
REPLACE函数仅支持接收单个字符串作为输入参数,而你的子查询会在单个作者有多本图书时返回多行书名结果,触发1242错误。 - 第二次写法错误原因:内层子查询没有和外层的作者ID做关联,返回的是全库所有图书的书名,不仅依旧存在多行返回问题,结果也无法和外层作者对应。
解决方案
根据你的需求分两种实现场景:
场景1:同一作者的所有书名拼接为单个字符串后替换
适用于需要每个作者仅返回一行结果的场景,MySQL环境下写法如下:
SELECT a.id AS author_id, a.name AS author_name, REPLACE(LOWER(GROUP_CONCAT(b.title SEPARATOR ', ')), 'wordReplace', '') AS processed_titles FROM authors a LEFT JOIN books b ON a.id = b.author_id GROUP BY a.id, a.name;
其他数据库对应替换拼接函数即可:PostgreSQL用
STRING_AGG(b.title, ', '),Oracle用LISTAGG(b.title, ', ')。
场景2:每个图书单独返回一行替换后的结果
适用于需要保留单本书维度结果的场景,写法如下:
SELECT a.id AS author_id, a.name AS author_name, REPLACE(LOWER(b.title), 'wordReplace', '') AS processed_title FROM authors a LEFT JOIN books b ON a.id = b.author_id;
如果需要过滤没有图书的作者,把LEFT JOIN改成INNER JOIN即可。
内容的提问来源于stack exchange,提问作者vsm
相关产品推荐
相关产品推荐

