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],