【问题标题】:Updating SQL Server query loop until X number reached更新 SQL Server 查询循环,直到达到 X 数
【发布时间】:2018-05-28 20:20:56
【问题描述】:

我需要同时更新数据库中的几行。现在的问题是我只会知道第一行的唯一 ID,但之后我将有 X 行其他行,这些行也需要使用一些数据进行更新。我会知道我需要多少个循环才能更新它们 - 只需要知道如何去做。

我的查询如下所示:

UPDATE bLine 
SET @val1 
WHERE theGuid = @val2;

现在@val1 的数据如下所示:

ID | qty_SerialNum | qty_Location | qty_Property | theGUID 
---+---------------+--------------+--------------+---------------------------
5  | 6845fg56      | Home         | NA           | a45vz-u300-2bd-4710j-vf09
6  | fk469fkh      | Dock#4       | NA           |
7  | geww2         | Dock#1       | Local        |
...

@val1

@val1 = qty_SerialNum = '6845fg56,fk469fkh,geww2',
        qty_Location = 'Home,Dock#4,Dock#1',
        qty_Property = 'NA,NA,Local' 
@val2 = theGUID = 'a45vz-u300-2bd-4710j-vf09'

所以这一切都很好,因为我知道 第一行GUID 需要更新,但 之后的每一行不会知道

所以第一次更新看起来像是 3 次更新:

UPDATE
   bLine
SET
   (qty_SerialNum = '6845fg56',qty_Location = 'Home',qty_Property = 'NA' )
WHERE 
   theGuid = 'a45vz-u300-2bd-4710j-vf09';

这将是 3 次更新中的第 2 次:

UPDATE
   bLine
SET
   (qty_SerialNum = 'fk469fkh',qty_Location = 'Dock#4',qty_Property = 'NA' )
WHERE 
   ???? = ????;

最后这将是 3 次更新中的第 3 次:

UPDATE
   bLine
SET
   (qty_SerialNum = 'geww2',qty_Location = 'Dock#1',qty_Property = 'Local' )
WHERE 
   ???? = ????;

所以这里的问题是 - 我如何循环遍历接下来的 X 行 并使用 @val1 中的 2,3,... 值更新该信息(跳过第一个,因为它已经通过 theGUID 保存)?

【问题讨论】:

  • 但是您的记录的顺序是什么?您在找到的行之后说 X 行,但您没有解释那些 next 行应该是什么顺序
  • @Steve 的顺序是一样的。它将对应于有多少行需要更新。在主要行(具有 GUID 的行)之后的每一行,它们将始终以相同的顺序排列
  • 用更多信息更新了我的 OP
  • 也许从您的数据和想要的结果开始...

标签: c# sql sql-server sql-server-2016


【解决方案1】:

您可以将此视为间隙和孤岛类型问题,您需要更新孤岛行(包含 guid 的行以及直到下一个孤岛的所有间隙行)。

我在这里和下面做一些假设是 working demo

create table bline (ID int, qty_SerialNum varchar(100),qty_Location varchar(100),qty_Property varchar(100), theGUID  varchar(100))
insert into bline values 
(5,'random','garbage','existing','a45vz-u300-2bd-4710j-vf09')
,(6,'data','random','garbage', NULL)
,(7,'existing','data','.', NULL);

create table #V (qty_SerialNum varchar(100),qty_Location varchar(100),qty_Property varchar(100))
insert into #V values
('6845fg56','Home','NA'),
('fk469fkh','Dock#4','NA'),
('geww2','Dock#1','Local')


;with map as
  (
       select id, 
          rn=row_number() over ( order by id asc) 
       from bline 
          where theGUID is NOT NULL
   ),
mappedBline as
   (
       select 
           b1.*,
           rn
       from
           bline b1 join
       (
           select b.id,
               rn=max(rn)
           from bline b 
               join map m
                   on b.id >=m.id
           group by b.id
         )b2 
       on b2.id=b1.id
     ),
updateSet as
    (
        select 
            M.*, 
            updaterow=row_number() over( order by M.id)
        from mappedBline M join
          mappedBline M2 
              on M.rn=M2.rn 
                and M2.theGUID = 'a45vz-u300-2bd-4710j-vf09' --@val2
     )

 update U
     set
         qty_SerialNum=V.qty_SerialNum,
         qty_Location= V.qty_Location,
         qty_Property =V.qty_Property
 from
 updateSet U join
 ( select 
      *, updaterow =row_number() over (order by (select NULL))
  from #V
  )V
  on U.updaterow=V.updaterow

select * from bline

【讨论】:

    【解决方案2】:

    你有一个非常神秘的问题。通常,SQL 更新不适用于这种方式的“相邻”行。但是,您可以通过将值存储在(虚拟)表中并将两侧连接在一起来使其工作:

    with v as (
          select v.*
          from (values (1, '6845fg56', 'Home', 'NA'),
                       (2, 'fk469fkh', 'Dock#4', 'NA'),
                       (3, 'geww2', 'Dock#1', 'Local')
               ) v(seqnum, qty_SerialNum, qty_Location, qty_Property)
         )
    update b
       set qty_SerialNum = v.qty_SerialNum,
           qty_Location = v.qty_Location,
           qty_Property = v.qty_Property
        from (select top(3) b.*,
                     row_number() over (order by id) as seqnum
              from bline b
              where id >= (select id from bline where theGUID = 'a45vz-u300-2bd-4710j-vf09'
              order by id
             ) b join
             v
             on b.seqnum = v.seqnum;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      相关资源
      最近更新 更多