同表子查询过滤数据时遇多行返回错误的解决求助
解决SQL子查询返回多行的错误
你遇到的single-row subquery returns more than one row错误,是因为你用LIKE去匹配一个返回多条记录的子查询了——LIKE和=这类操作符只能对应单个值,子查询返回多行就会触发这个报错。
按照你的需求,要拿第一个查询的结果过滤第二个查询,也就是找出同时满足以下两个条件的workorder:
- 存在于「equipment含ABC且dataofinterest含EFG」的结果集中
- 自身满足
dataofinterest LIKE '%HIJ%'
下面给你几个可行的写法:
方法1:用IN替代LIKE
把原来的workorder LIKE改成workorder IN,因为IN可以匹配多个值:
SELECT workorder FROM pidata WHERE dataofinterest LIKE '%HIJ%' AND workorder IN ( SELECT workorder FROM pidata WHERE equipment LIKE '%ABC%' AND dataofinterest LIKE '%EFG%' )
方法2:用EXISTS关联子查询
这种写法性能通常更好,尤其是表数据量大的时候,它会逐行检查是否存在匹配的记录:
SELECT p1.workorder FROM pidata p1 WHERE p1.dataofinterest LIKE '%HIJ%' AND EXISTS ( SELECT 1 FROM pidata p2 WHERE p2.workorder = p1.workorder AND p2.equipment LIKE '%ABC%' AND p2.dataofinterest LIKE '%EFG%' )
方法3:用JOIN实现
通过自连接来筛选符合条件的记录,逻辑更直观:
SELECT DISTINCT p1.workorder FROM pidata p1 JOIN pidata p2 ON p1.workorder = p2.workorder WHERE p1.dataofinterest LIKE '%HIJ%' AND p2.equipment LIKE '%ABC%' AND p2.dataofinterest LIKE '%EFG%'
这里加DISTINCT是为了避免同一个workorder出现重复结果。
内容的提问来源于stack exchange,提问作者runjc
相关产品推荐
相关产品推荐

