2016-12-09 46 views
0

根据某些条件更新结果集时遇到困难。一些帐号号码为空,但是根据不同的标识符进行匹配。使用IF语句更新行

我正在更新与匹配的空帐号,但不能完全得到的语法工作。我运行到错误

多部分组成的标识符“CMRR.aacount_number”无法找到

这是在几个不同的地方,我引用了其他表。

DECLARE @BatchId INT 
SET @BatchId = 1030 

SELECT 
    CMRR.id, 
    CMRR.account_number, 
    CMRR.URN 
FROM 
    CRA_METRO2_REJECTED_RECORDS AS CMRR 
WHERE 
    batch_id = @BatchId 

IF CMRR.account_number = '' 
BEGIN 
    UPDATE CRA_METRO2_REJECTED_RECORDS 
    SET CMRR.account_number = (SELECT account_number 
           FROM CRA_METRO2_REJECTED_RECORDS 
           WHERE URN = CMRR.URN 
            AND account_number != '') 
    WHERE id = CMRR.id 
END 
+0

您需要在账户号码存储到一个变量供以后使用或使用'IF(EXISTS(SELECT ...))BEGIN ... END' – scsimon

+0

错误信息是非常明确的。您在'update'语句中没有定义CMRR别名。 –

+0

@vkp'CRA_METRO2_REJECTED_RECORDS AS CMRR'并且这个错误信息发生在'UPDATE'之前。 – Jared

回答

2

我相信这样做你想要的东西。我加3个变量,从你的SELECT语句包含的值。你要检查的数据类型,因为我只是用INT不知道他们在你的系统是什么,然后在你身上使用这些变量r更新声明。

DECLARE @BatchId INT 

-- Added variables 
DECLARE @id INT 
DECLARE @urn INT 
DECLARE @account_number INT 

SET @BatchId = 1030 

-- Assign values to variables 
SELECT 
    @id = id 
    , @account_number = account_number 
    , @urn = urn 
FROM CRA_METRO2_REJECTED_RECORDS 
WHERE batch_id = @BatchId 


IF @account_number = '' 
BEGIN 
    UPDATE CRA_METRO2_REJECTED_RECORDS 
    SET account_number = (SELECT account_number 
          FROM CRA_METRO2_REJECTED_RECORDS 
          WHERE URN = @URN 
          AND account_number != '') 
    WHERE id = @id 
END 

编辑

简短的聊天后,这是解决方案。

UPDATE cmrr1 
SET cmrr1.account_number = cmrr2.account_number 
FROM CRA_METRO2_REJECTED_RECORDS cmrr1 
JOIN CRA_METRO2_REJECTED_RECORDS cmrr2 ON cmrr1.URN = cmrr2.URN AND cmrr2.account_number <> '' 
WHERE cmrr1.batchid = @batchid 
AND cmrr1.accound_number = '' 
+0

我解决了这个问题:( – Jared

+0

@jared whats the error? – SQLChao

+0

所以现在的问题是,这并没有更新我的所有行,哪个帐号是空的 – Jared