子查询返回了多个值。 !StoredProcedure的[DBO] [MachineCTE]脚本日期:11/12这是当子查询如下=,=,<, <= , >,> =
“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倍的值。这是当子查询跟随不允许=,!=,<,< =,>,> =,或当子查询用作表达
到最简单的方法避免问题是包括在TOP 1
子查询:
ISNULL((SELECT TOP 1 mcopsts FROM #MachineCTE MCTE WHERE State = 'GOOD' and MCTE.mcdesp = CTE.mcdesp), 0) AS [GOOD],
但是,那只是回避真正的问题。为什么你期望只有一行被返回,如果多个可能匹配?如果有多个匹配,你想如何合并多行的值?
它*应该是不言自明的,其中一个子查询('SELECT mcopsts FROM #MachineCTE MCTE WHERE State ='GOOD'and MCTE.mcdesp = CTE.mcdesp')返回多个值。最简单的解决方法是在子查询中选择'SELECT TOP'。 –
为了扩展EBrown已经说过的内容:如果在select子句中有一个子查询,那么该子查询最多可以返回**一行**。否则,你会得到你得到的错误。要么确保子查询(子查询)最多只返回一行,要么用连接重写查询以适应返回的多行。 –
请在SO上阅读[此问题](http://stackoverflow.com/q/2653188/243373)并研究发布在那里的答案。你应该能够解决这个问题,并在那里发布答案。 –