2013-02-25 25 views
1

我已经发出了我的sql服务器查询。当我运行这段代码,我得到一个错误:返回了超过1个值的错误

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

我已经尝试了很多方法,但它仍然错误 - 我怎样才能解决呢?

+0

获得完全摆脱了相关子查询的。他们是性能杀手,如果可能的话,不应该用在生产代码中。这只是一种糟糕的编程技术。 – HLGEM 2013-02-25 15:39:17

回答

4

错误非常简单。您的子查询返回多于一行。这是不允许的,因为查询的工作方式。 SELECT子句中的内容不能定义多行,这必须在FROM子句中。

有很多方法来解决这个问题,他们中的一些:

SELECT (SELECT MAX(field) ...) 
SELECT (SELECT field ... GROUP BY field) 
SELECT (SELECT TOP 1 field ...) 

的问题是,上述所有的(与GROUP BY可能是个例外,它可能无法正常工作)很有可能是返回不需要的数据 - 原始查询中每行只有一行。

您可能想要使用XML PATH将所有这些值连接成单个单元格。

或者,如果你满意的多行,使用JOIN代替

SELECT someAlias.field 
... 
JOIN table as someAlias ON someAlias.somefield = someothertable.someotherfield 

如:

SELECT A.MR_EMPLOYEE_CHECKROLL_TYPE_ID 
FROM T_PR_CHECKROLL_WISE_LOG 
     JOIN T_TR_CLOSING 
     ON T_TR_CLOSING.CLOSING_ID = T_PR_CHECKROLL_WISE_LOG.CLOSING_ID 
     JOIN T_PR_EMPLOYEE_LOG 
     ON T_PR_EMPLOYEE_LOG.CLOSING_ID = T_TR_CLOSING.CLOSING_ID 
     JOIN T_PR_EMPLOYEE_LOG AS A 
     ON A.EMP_ID = T_PR_CHECKROLL_WISE_LOG.EMP_ID 
WHERE T_PR_CHECKROLL_WISE_LOG.CLOSING_ID = '1' 
+0

其实我有很多字段查询buat只有这个领域我得到的错误,我已经编辑了一个完整的查询上面的答案,这个字段查询,除了大胆的查询是好的工作。顺便感谢你的建议 – barrbarry 2013-02-25 13:09:35

+0

@ElyinTrifena可能有超过1个匹配的行。我可能会在子查询中尝试'GROUP BY MR_EMPLOYEE_CHECKROLL_TYPE_ID'(它只会丢弃重复项,所以会“安全地”修复或者可能仍然不起作用)或'JOIN'(对于多行)。否则,您需要真正检查它返回的内容,看看为什么有多个匹配项(最简单的方法就是用'JOIN'来完成)。 – Dukeling 2013-02-25 13:28:41

+0

**(SELECT MR_EMPLOYEE_CHECKROLL_TYPE_ID FROM T_PR_EMPLOYEE_LOG WHERE T_PR_EMPLOYEE_LOG.EMP_ID = T_PR_CHECKROLL_WISE_LOG.EMP_ID)AS CHECKROLL_ID **, 我应该添加** GROUP BY MR_EMPLOYEE_CHECKROLL_TYPE_ID **在选择 如 **(SELECT MR_EMPLOYEE_CHECKROLL_TYPE_ID FROM T_PR_EMPLOYEE_LOG WHERE T_PR_EMPLOYEE_LOG .EMP_ID = T_PR_CHECKROLL_WISE_LOG.EMP_ID GROUP BY MR_EMPLOYEE_CHECKROLL_TYPE_ID)作为CHECKROLL_ID,** 非常感谢您的帮助,这真的帮助我 – barrbarry 2013-02-25 13:53:49

相关问题