【问题标题】:Iterate through an SQL Server table and insert rows遍历 SQL Server 表并插入行
【发布时间】:2015-06-25 19:57:13
【问题描述】:

一张表(Table1)有以下数据:

+-----------+------------+-----------+---------+ |帐号 |老支行 |新支行 |余额 | +-----------+------------+-----------+---------+ | 785321 | 10 | 20 | -200 | | 785322 | 10 | 20 | 300 | +-----------+------------+-----------+---------+

使用逻辑:
如果余额为负数(即 如果余额为正(即>0),则必须借记旧分行(Dr),贷记新分行(Cr);
下面的行必须插入另一个表(表2)

+------------+------+--------+--------+ |帐号 |铬博士 |分行 |金额 | +------------+------+--------+--------+ | 785321 |博士 | 20 | 200 | | 785321 |铬 | 10 | 200 | | 785322 |铬 | 20 | 300 | | 785322 |博士 | 10 | 300 | +------------+------+--------+--------+

使用光标或其他方式的可能解决方案是什么?

谢谢,

【问题讨论】:

  • 当然不是游标。你只需要两个更新语句。
  • 该问题表明您是一名从事 SQL 工作的软件开发人员。在考虑 SQL 时,您必须忘记存在循环/迭代(它们派上用场,但仅在极少数情况下),但要考虑数据组和数据集,以及如何将它们链接在一起。正如 Sean 指出的那样,您需要两个更新语句(可能在事务中),方法是为每个语句选择所需的数据(一个用于 oldbranch,一个用于 newbranch)。
  • 是的,您的思维定式被困在程序世界中。与其考虑更改行,不如将想法转移到要对列执行的操作上。
  • 我认为下面的所有答案都忽略了需要从两行“创建”四行的事实。如果数据不存在,这不是更新语句,它是 CROSS JOIN(或 INNER JOIN)来生成行,INSERT 来将它们放入表中。也许OP可以在我提出答案之前确认。

标签: sql-server iteration


【解决方案1】:

你没有提供太多细节,但这样的事情应该很接近。

update nb
set Balance = Balance - ABS(t1.Balance)
from NewBranch nb
join Table1 t1 on t1.AccountNo = nb.AccountNo
where nb.Balance < 0

update ob
set Balance = Balance - ABS(t1.Balance)
from OldBranch ob
join Table1 t1 on t1.AccountNo = ob.AccountNo
where ob.Balance > 0

【讨论】:

    【解决方案2】:

    你绝对不需要游标,只需要一组插入语句

    INSERT INTO Table2 (AccountNo,DrCr,Branch,Amount) 
    SELECT AccountNo,'Dr',IIF(Balance<0,NewBranch,OldBranch),IIF(balance<0,-1*balance,balance) FROM Table1
    UNION ALL
    SELECT AccountNo,'Cr',IIF(Balance>0,NewBranch,OldBranch),IIF(balance<0,-1*balance,balance) FROM Table1
    

    【讨论】:

      【解决方案3】:
      declare @t table (Accountno int,
                        OldBranch INT,
                        NewBranch int,
                        Balance int)
      insert into @t (Accountno,
                     OldBranch,
                     NewBranch,
                     Balance)
      values (785321,10,20,200),
             (785322,10,20,300)
      
      select Accountno,Y.CRDR,Y.Branch,Y.Amount from @t CROSS APPLY 
      (Select 'Dr' AS CRDR,OldBranch AS Branch,Balance As Amount 
             UNION ALL 
      
         Select 'Cr',NewBranch,Balance)y
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多