【问题标题】:Update rows using an IF statement使用 IF 语句更新行
【发布时间】:2017-04-25 09:00:25
【问题描述】:

根据某些情况,我在更新结果集时遇到了困难。一些帐号为空,但基于不同的标识符进行匹配。

我正在使用匹配的帐号更新空帐号,但无法使语法完全正常工作。我遇到了错误

找不到多部分标识符“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

【问题讨论】:

  • 您需要将该帐号存储到一个变量中以备后用或使用IF(EXISTS(SELECT....)) BEGIN...END
  • 错误信息很清楚。您没有在 update 语句中定义 CMRR 别名。
  • @vkp CRA_METRO2_REJECTED_RECORDS AS CMRR 并且此错误消息发生在 UPDATE 之前
  • 是什么让你觉得@Jared
  • 我明白了..您稍后也会在update 中收到错误消息。 IF CMRR.account_number = '' 导致错误。在select 完成后,别名CMRR 无效。您可以将帐号存储在变量中并将其用于IF

标签: sql-server tsql


【解决方案1】:

我相信这可以满足您的需求。我添加了 3 个变量来保存您的 select 语句中的值。您需要检查数据类型,因为我刚刚使用 INT 不知道它们在您的系统中是什么。然后在更新语句中使用这些变量。

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 = ''

【讨论】:

  • 所以现在的问题是这不会更新我所有帐号为空的行。
  • @Jared 您正在过滤 id。因此,初始选择返回的任何 id 都是唯一将被更新的。
  • 是的,batch_id 但是有 66,000 条记录,其中一些有空的帐号。或者你觉得我过滤的方式有问题吗?
  • @jared 你能来这个聊天吗,我们不必通过 cmets 聊天。 chat.stackoverflow.com/rooms/130254/for-jared
猜你喜欢
  • 1970-01-01
  • 2015-05-09
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
相关资源
最近更新 更多