SQL多条件调用列报错:子查询返回多个值问题求助
问题解决与SQL实现
报错原因
你的子查询没有关联当前项目的ProjectID,也没限定只返回当前项目的结果,导致子查询返回了所有符合LIKE条件的多行数据。而作为表达式的子查询只能返回单个值,这就触发了Msg 512错误。
正确SQL写法
方法1:条件聚合(推荐,兼容多数场景)
利用CASE语句配合聚合函数,将同一项目的两类任务数据行转列:
SELECT p.Name AS ProjectName, MAX(CASE WHEN pt.Name LIKE '%PCA%' THEN pt.Name END) AS PCA_Name, MAX(CASE WHEN pt.Name LIKE '%PCA%' THEN pt.Time END) AS PCA_Time, MAX(CASE WHEN pt.Name LIKE '%PCO%' THEN pt.Name END) AS PCO_Name, MAX(CASE WHEN pt.Name LIKE '%PCO%' THEN pt.Time END) AS PCO_Time FROM Projects p JOIN Projecttasks pt ON p.GUID = pt.ProjectID GROUP BY p.Name
注:因为每个项目仅对应1条PCA和1条PCO任务,用MAX/MIN都能准确提取到对应值。
方法2:多表关联(逻辑直观)
直接分别关联出每个项目的PCA和PCO任务表:
SELECT p.Name AS ProjectName, pca.Name AS PCA_Name, pca.Time AS PCA_Time, pco.Name AS PCO_Name, pco.Time AS PCO_Time FROM Projects p JOIN Projecttasks pca ON p.GUID = pca.ProjectID AND pca.Name LIKE '%PCA%' JOIN Projecttasks pco ON p.GUID = pco.ProjectID AND pco.Name LIKE '%PCO%'
注:该方法要求每个项目必须同时存在PCA和PCO任务,否则会过滤掉缺失任务的项目。
原SQL的问题总结
- 子查询未关联主查询的
ProjectID,导致返回全局符合条件的所有行; - 基础
JOIN会产生重复行(每个项目对应2条任务行),进一步放大了子查询的返回值冲突问题。
内容的提问来源于stack exchange,提问作者Pale
相关产品推荐
相关产品推荐

