2016-11-12 35 views
-2

「USE [SAPL_BK_NEW] GO /******對象不允許/ 2016 10時32分48秒******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO --exec MachineCTE 'AQUARELL'子查詢返回了多個值。 !StoredProcedure的[DBO] [MachineCTE]腳本日期:11/12這是當子查詢如下=,=,<, <= , >,> =

ALTER PROC [DBO]。[MachineCTE] ( @companyName varchar(100) ) AS BEGIN

CREATE TABLE #MachineCTE ( ID INT, mcdesp VARCHAR(最大), mccost INT, mcopsts VARCHAR(30), 國家VARCHAR(100), mcfact VARCHAR(50), mccomp VARCHAR(60) );

WITH Machine_CTE(ID,mcdesp,mccost,mcopsts,國家,mcfact,mccomp) AS(SELECT ROW_NUMBER)OVER(ORDER BY mcdesp ASC(), mac.mcdesp機器,計數(mac.mccost

)作爲成本,計數(mcopsts)爲條件,mcopsts爲[國家] mcfact,mccomp 與機器的MAC
其中RTRIM(mac.mccomp)= @的companyName GROUP BY mcdesp,mcopsts,mcfact,mccomp)

INSERT INTO #MachineCTE select Machine_CTE select ID,mcdesp,mccost,mcopsts,State,mcfact,mccomp

select * from(SELECT CTE.mcde sp as Machines_Name, SUM(CTE.mccost)as Total_Machines, ISNULL((SELECT mcopsts FROM #MachineCTE MCTE WHERE State ='GOOD'and MCTE.mcdesp = CTE.mcdesp),0)AS [GOOD], ISNULL( (SELECT mcopsts FROM #MachineCTE MCTE WHERE State ='IDLE'and MCTE.mcdesp = CTE.mcdesp),0)AS [IDLE], ISNULL((SELECT mcopsts FROM #MachineCTE MCTE WHERE State ='UR'and MCTE.mcdesp = CTE.mcdesp),0)AS [UR] FROM #MachineCTE CTE GROUP BY mcdesp)T1 UNION ALL SELECT * FROM (SELECT CTE.mcdesp如Machines_Name, '0' 作爲Total_Machines, '0' AS [GOOD], '0'AS [IDLE], '0'AS [UR] FROM #MachineCTE CTE where mcf ACT = '額外' GROUP BY mcdesp,mccomp,mcopsts,mcfact)T2

DROP TABLE #MachineCTE

END」

請幫忙解決這個問題

選擇 CTE.mcdesp爲Machines_Name, SUM(CTE.mccost)作爲Total_Machines, ISNULL((SELECT mcopsts FROM #MachineCTE MCTE WHERE狀態= '好' 和MCTE.mcdesp = CTE.mcdesp),0)AS [GOOD], ISNULL((SELECT mcopsts FROM #MachineCTE MCTE WHERE State ='IDLE'和MCTE.mcdesp = CTE。 mcdesp),0)AS [IDLE], ISNULL((SELECT mcopsts FROM #MachineCTE MCTE WHERE State ='UR'and MCTE.mcdesp = CTE。mcdesp),0)AS [UR] FROM #MachineCTE CTE GROUP BY mcdesp

上面的語句是問題

子查詢返回大於1倍的值。這是當子查詢跟隨不允許=,!=,<,< =,>,> =,或當子查詢用作表達

+6

它*應該是不言自明的,其中一個子查詢('SELECT mcopsts FROM #MachineCTE MCTE WHERE State ='GOOD'and MCTE.mcdesp = CTE.mcdesp')返回多個值。最簡單的解決方法是在子查詢中選擇'SELECT TOP'。 –

+0

爲了擴展EBrown已經說過的內容:如果在select子句中有一個子查詢,那麼該子查詢最多可以返回**一行**。否則,你會得到你得到的錯誤。要麼確保子查詢(子查詢)最多隻返回一行,要麼用連接重寫查詢以適應返回的多行。 –

+0

請在SO上閱讀[此問題](http://stackoverflow.com/q/2653188/243373)並研究發佈在那裏的答案。你應該能夠解決這個問題,並在那裏發佈答案。 –

回答

0

最簡單的方法避免問題是包括在TOP 1子查詢:

ISNULL((SELECT TOP 1 mcopsts FROM #MachineCTE MCTE WHERE State = 'GOOD' and MCTE.mcdesp = CTE.mcdesp), 0) AS [GOOD], 

但是,那只是迴避真正的問題。爲什麼你期望只有一行被返回,如果多個可能匹配?如果有多個匹配,你想如何合併多行的值?

相關問題