2013-02-25 22 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

相關問題