【问题标题】:why sp returning error: subquery returned more than 1?为什么sp返回错误:子查询返回超过1?
【发布时间】:2015-02-18 09:28:38
【问题描述】:

我正在执行一个返回错误的过程:

子查询返回超过 1 个值。这是不允许的,当 子查询遵循 =、!=、、>= 或当子查询用作 一个表达式。

我知道,因为某些字段预计会返回超过 1 个值,但我需要处理它,我正在处理借方、贷方减法结果,如 CR-DR 等

(
   Conductor_ID
)
    Set @AccID= (Select Account_ID FROM Transport.Conductors WHERE ConductorID in (@ConductorID))
            Set @AccCredit= (Select CR from [dbo].[Transactions] where Account_ID in (@AccID))
            Set @AccDebit= (Select DR from [dbo].[Transactions] where Account_ID in (@AccID))
            Set @Total= @AccCredit-@AccDebit

【问题讨论】:

  • 检查子查询是返回单行还是多行
  • 如果有多个,你想用哪个?
  • 如果它返回多个值,您应该使用表变量或临时表。
  • @PareshJ 我不太了解 sql,如果你们能帮助我,我会尽力而为,我不明白该怎么做:(
  • @AamirShah - 变量只能保存一个值(即)一行。但是您的子查询返回不止一行。所以现在您需要将哪一行存储在该变量中。如果要存储多行,请使用临时表

标签: sql sql-server sql-server-2012


【解决方案1】:

试试 使用 max() :它将选择最大值,因此不会有任何多行选择冲突。

Set @AccID= (Select MAX(Account_ID) FROM Transport.Conductors WHERE         ConductorID in (@ConductorID))
        Set @AccCredit= (Select MAX(CR) from [dbo].[Transactions] where Account_ID in (@AccID))
        Set @AccDebit= (Select MAX(DR) from [dbo].[Transactions] where Account_ID in (@AccID))
        Set @Total= @AccCredit-@AccDebit

【讨论】:

  • 这里你将值分配给一个变量,所以这里有必要从子查询中返回一个值,这是强制性的。
  • 它会给我带来意想不到的结果,我需要处理所有值 bro
【解决方案2】:

如果没有错,这就是你需要的

SELECT Account_ID,
       CR,
       DR,
       Total = CR - DR
FROM   [dbo].[Transactions] T
       JOIN Transport.Conductors C
         ON T.Account_ID = C.Account_ID
WHERE  C.ConductorID IN ( @ConductorID ) 

【讨论】:

  • 哦,太好了,它可以工作,但我很好奇它是如何工作的?我的意思是这部分 Total = CR - DR
  • 如果你能解释一下,我将不胜感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 2013-10-24
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多