如何遍历一次删除一行

时间:2019-04-24 13:29:32

标签: sql sql-server sql-server-2012

我想知道是否有一种方法可以重组下面的SQL,以便一次删除一行,而不是一次批量删除?原因是删除操作导致该表上的触发器执行,并且(在USER_ID具有多于1行的情况下)正试图将数据插入到另一个以datetime时间戳为键的表中( (以毫秒为单位)正在尝试插入,并导致重复的键插入错误。

DELETE ORDERS
FROM LINE_ORDER ORDERS
INNER JOIN LINE_ORDER_XREF B ON B.OPRID = ORDERS.USER_ID
WHERE B.USERID = 'SYSACCT'

当时的想法是,如果将每一行作为自己的事务分别删除,那么这将使每个日期时间戳都唯一。在这种情况下,删除操作的数量将很少,并且不需要额外的处理时间。是否可以构造成某个循环或使用游标? LINE_ORDERUSER_IDUSER_ROLE)中的主要ID列是varchar列,所以我不认为我可以增加它。

USER_ID     USER_ROLE   DYNAMIC_SW
11000_600   E_SAML      N
11000_602   E_SAML      N
11000_602   SUPRV       N
11000_604   E_PRO       N
11000_605   E_SAML      N

2 个答案:

答案 0 :(得分:0)

好吧,您可以为此使用TOP

DELETE o
FROM (SELECT TOP (1) o.*
      FROM LINE_ORDER o INNER JOIN
           LINE_ORDER_XREF lox
           ON lox.OPRID = o.USER_ID
      WHERE lox.USERID = 'SYSACCT'
     ) o;

然后您需要将其嵌入循环中以删除所有匹配的值。

答案 1 :(得分:0)

您可以尝试以下方法:

select t.CADID, t.TECHNOLOGYTYPE, t.ACCESSSUPPLIER, t.LOCATION, t.LOCATIONTYPE, t.NETWORKTYPE, t.ACCESSTYPE, t.CARRIERTYPE, t.MAXDOWNSPEED, t.MAXUPSPEED, v.NAME, v.VALUE 
from( TableA t 
LEFT OUTER JOIN TableB VIEW0 ON (VIEW0.access_supplier = t.access_supplier
                                            AND VIEW0.network_type = t.network_type
                                            AND VIEW0.address_location_type_map_id = t.address_location_type_map_id
                                            AND VIEW0.NAME = 'Nls-type')
LEFT OUTER JOIN TableB VIEW1 ON (VIEW1.access_supplier = t.access_supplier
                                           AND VIEW1.network_type = t.network_type
                                            AND VIEW1.address_location_type_map_id = t.address_location_type_map_id
                                            AND VIEW1.NAME = 'NL-type')
LEFT OUTER JOIN TableB VIEW2 ON (VIEW2.access_supplier = t.access_supplier
                                            AND VIEW2.network_type = t.network_type
                                            AND VIEW2.address_location_type_map_id = t.address_location_type_map_id
                                            AND VIEW2.NAME = 'Net-type')
LEFT OUTER JOIN TableB VIEW3 ON (VIEW3.access_supplier = t.access_supplier
                                            AND VIEW3.network_type = t.network_type
                                            AND VIEW3.address_location_type_map_id = t.address_location_type_map_id
                                            AND VIEW3.NAME = 'Interconnect-level')
LEFT OUTER JOIN TableB VIEW4 ON (VIEW4.access_supplier = t.access_supplier
                                            AND VIEW4.network_type = t.network_type
                                            AND VIEW4.address_location_type_map_id = t.address_location_type_map_id
                                            AND VIEW4.NAME = 'FTU-type')
LEFT OUTER JOIN TableB VIEW5 ON (VIEW5.access_supplier = t.access_supplier
                                            AND VIEW5.network_type = t.network_type
                                            AND VIEW5.address_location_type_map_id = t.address_location_type_map_id
                                            AND VIEW5.NAME = 'Area-type')
 )WHERE (t.cad_id = '237864868')
cross apply
     (values ('a', VIEW0.name as name0, VIEW0.value as vaue0),
             ('b', VIEW1.name as name1, VIEW1.valueb as value1),
             ('c', VIEW2.name as name2, VIEW2.valuec as value2),
             ('d', VIEW3.name as name3, VIEW3.valued as value3)
     ) v(which, name, value)
where v.name is not null or
      (v.which = 'a' and
       v.name0 is null and v.name1 is null and v.name2 is null and v.name3 is null
      );
相关问题