2015-06-29 47 views
2

这段代码产生这样的结果选择查询生成的结果,但不是如果

SELECT PER.GLACCOUNT, PER.PERIOD,(SELECT GL.[CLOSING_CREDIT] 
    FROM [EMBDATA].[DBO].[_EMB_GL_ACTUALVALUESTYP] AS GL 
    WHERE GL.PERIOD = (DBO.GETMAXPERIOD(PER.GLACCOUNT,PER.PERIOD)) 
    AND GL.ID COLLATE SQL_Latin1_General_CP1_CS_AS =    
    COLLATE SQL_Latin1_General_CP1_CS_AS) AS BALANCE 
    FROM [DBO].[GL_PERIOD_BAL] AS PER 
    WHERE LEFT(PER.GLACCOUNT,4) = 'NM01' AND [BAL.TYPE] = 'R' 
    ORDER BY PER.GLACCOUNT,PER.PERIOD GLACCOUNT PERIOD BALANCE) 

结果

NM01-4100-0015 2015-12 7081557.0000 
NM01-4100-0016 2015-12 0.0000 
NM01-4100-0017 2015-12 0.0000 
NM01-4100-0018 2015-12 12329577.0000 
NM01-4100-0019 2015-12 1622830124.0000 
NM01-4100-0020 2015-12 0.0000 
NM01-4100-0021 2015-12 23747.0000 
NM01-4100-0022 2015-12 0.0000 
NM01-4100-0023 2015-12 1623014.0000 

但是,如果我想将它合并到一个更新语句,它不是”更新子句中使用t更新 的代码。

UPDATE [DBO].[GL_PERIOD_BAL] 
SET [CLOSING_CREDIT] = (SELECT GL.[CLOSING_CREDIT] 
FROM [EMBRACEDATA].[DBO].[_EMB_GL_ACTUALVALUESTYP] GL 
WHERE GL.PERIOD = (DBO.GETMAXPERIOD(GLACCOUNT,PERIOD)) 
AND GL.ID COLLATE SQL_Latin1_General_CP1_CS_AS = 
GLACCOUNT COLLATE SQL_Latin1_General_CP1_CS_AS) 
WHERE LEFT(GLACCOUNT,4) = 'NM01' AND [BAL.TYPE] = 'R' 

回答

0

当您尝试在Oracle中使用子查询更新,如果子查询返回多行,它提供了以下错误信息: “单行子查询返回多个行”

我猜你也是如此。子查询不应该返回多于一行,以便成功更新。 您需要使用其中一个有助于限制获取的行数的子句,这可能是顶级子句,限制子句等。这应该根据您希望选择的数据来决定/操作更新。

0

非常感谢您的意见。

我已经设法通过向所有列添加别名来找到解决方案。

UPDATE [dbo].[GL_PERIOD_BAL] 

     SET[dbo].[GL_PERIOD_BAL] . [CLOSING_CREDIT] = (SELECT GL. [CLOSING_CREDIT] 
         FROM [EmbraceData].[dbo].[_EMB_GL_ACTUALVALUESTYP] AS GL 
     WHERE GL.PERIOD = (DBO.gETMAXPERIOD([dbo]. [GL_PERIOD_BAL].GLACCOUNT,[dbo]. [GL_PERIOD_BAL].PERIOD)) 
          AND GL.ID COLLATE SQL_Latin1_General_CP1_CS_AS 
         = [dbo].[GL_PERIOD_BAL].GLACCOUNT  
     COLLATE SQL_Latin1_General_CP1_CS_AS) 
         WHERE LEFT([dbo].[GL_PERIOD_BAL].GLACCOUNT,4) = 'NM01' AND [dbo].[GL_PERIOD_BAL].[BAL.TYPE] = 'R'