C# 子查询返回了多个值。当子查询在=、!=、

C# 子查询返回了多个值。当子查询在=、!=、,c#,sql-server-2008,stored-procedures,C#,Sql Server 2008,Stored Procedures,请帮忙解决这个问题 'USE [SAPL_BK_NEW] GO /****** Object: StoredProcedure [dbo].[MachineCTE] Script Date: 11/12/2016 10:32:48 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO --exec MachineCTE 'AQUARELL' ALTER proc [dbo].[MachineCTE] ( @companyNam

请帮忙解决这个问题

'USE [SAPL_BK_NEW]
GO
/****** Object:  StoredProcedure [dbo].[MachineCTE]    Script Date: 11/12/2016 10:32:48 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--exec MachineCTE 'AQUARELL'

ALTER proc [dbo].[MachineCTE]
(
@companyName varchar(100)
)
AS
BEGIN

CREATE TABLE #MachineCTE
(
ID int,
mcdesp varchar(max),
mccost int, 
mcopsts varchar(30),
State varchar(100),
mcfact varchar(50),
mccomp varchar(60)
);

WITH Machine_CTE(ID,mcdesp,mccost, mcopsts,State,mcfact,mccomp)
AS (SELECT ROW_NUMBER() OVER(ORDER BY mcdesp ASC),
mac.mcdesp  as Machine,count(mac.mccost ) as Cost,count(mcopsts ) as Condition,mcopsts  as [State],mcfact,mccomp
FROM Machine mac    
where Rtrim(mac.mccomp)=@companyName  GROUP BY mcdesp ,mcopsts,mcfact,mccomp)

insert into #MachineCTE select ID,mcdesp,mccost, mcopsts,State,mcfact,mccomp from Machine_CTE




select * from (SELECT 
    CTE.mcdesp 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 as Machines_Name,
    '0' as Total_Machines,
    '0' AS [GOOD],
    '0' AS [IDLE],
    '0' AS [UR] 
FROM #MachineCTE CTE where mcfact='EXTRA' GROUP BY mcdesp,mccomp,mcopsts,mcfact)  t2  


drop table #MachineCTE


END'
上述声明就是问题所在

子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时

避免问题的最简单方法是在子查询中包含TOP 1:

SELECT 
    CTE.mcdesp 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

然而,这只是在回避真正的问题。如果多行可能匹配,为什么只返回一行?如果存在多个匹配项,您希望如何组合多行中的值?

这应该是不言自明的,其中一个子查询从MachineCTE MCTE中选择mcopsts,其中State='GOOD'和MCTE.mcdesp=CTE.mcdesp返回多个值。最简单的修复方法是用子查询选择TOP 1。要扩展EBrown已经说过的内容:如果SELECT子句中有子查询,则该子查询最多可以返回一行。否则,您将得到所得到的错误。请确保子查询最多返回一行,或者使用联接重写查询以适应返回的多行。请继续阅读,并研究那里发布的答案。你应该能够通过张贴在那里的答案来解决这个问题。谢谢你的宝贵意见解决了这个问题
ISNULL((SELECT TOP 1 mcopsts FROM #MachineCTE MCTE WHERE State = 'GOOD' and MCTE.mcdesp  = CTE.mcdesp), 0) AS [GOOD],