怎么有效率的对A表包含B表ID的数据进行更新
如何有效率的对A表包含B表ID的数据进行更新
A表
id 名称 mm
1 aa 1,2,3
2 bb 2,3
3 cc 1,3
B表。
id 名称
1 aa
2 bb
3 cc
现在我想删掉B表某条数据,删除是同时更新A表字段MM,把包含删掉那条数据的ID去掉。
比如:我要删掉B表第一条数据时,同时把A表字段MM的1都去掉
如下面数据
A表
id 名称 mm
1 aa 2,3
2 bb 2,3
3 cc 3
B表。
id 名称
2 bb
3 cc
原本想到用like的,但如果数据超出9条后就不理想了。。
------解决思路----------------------
------解决思路----------------------
你参考下,兼容删除多条,及删除B表id 1 A表 111,2,3不受影响等情况
------解决思路----------------------
修正如下
A表
id 名称 mm
1 aa 1,2,3
2 bb 2,3
3 cc 1,3
B表。
id 名称
1 aa
2 bb
3 cc
现在我想删掉B表某条数据,删除是同时更新A表字段MM,把包含删掉那条数据的ID去掉。
比如:我要删掉B表第一条数据时,同时把A表字段MM的1都去掉
如下面数据
A表
id 名称 mm
1 aa 2,3
2 bb 2,3
3 cc 3
B表。
id 名称
2 bb
3 cc
原本想到用like的,但如果数据超出9条后就不理想了。。
------解决思路----------------------
create trigger test
on b
for delete
as
begin
update a set mm=stuff(replace(','+mm,','+b.名称,''),1,1,'')
from deleted as b join a
on a.id =b.id
where exists (select 2 from deleted where deleted.id=a.id)
end
------解决思路----------------------
你参考下,兼容删除多条,及删除B表id 1 A表 111,2,3不受影响等情况
IF object_id('tgr_B_delete', 'TR') is not NULL
DROP trigger tgr_B_delete
GO
create trigger tgr_B_delete
on B
for delete
as
BEGIN
DECLARE @BID VARCHAR(10)
DECLARE @BINDEX VARCHAR(10)
DECLARE @T TABLE(ID INT,I INT)
INSERT INTO @T SELECT ID,ROW_NUMBER()OVER(ORDER BY GETDATE()) FROM DELETED
SELECT TOP 1 @BID=CAST(ID AS VARCHAR(10)),@BINDEX=I FROM @T ORDER BY I
WHILE @@ROWCOUNT<>0
BEGIN
UPDATE A
SET mm=STUFF(REPLACE(','+mm+',',','+@BID+',',','),1,1,'')
WHERE ','+ mm+',' LIKE '%,'+@BID+',%'
UPDATE A
SET mm=STUFF(mm,LEN(mm),1,'')
DELETE FROM @T WHERE I=@BINDEX
SELECT TOP 1 @BID=CAST(ID AS VARCHAR(10)),@BINDEX=I FROM @T ORDER BY I
END
END
GO
------解决思路----------------------
修正如下
IF object_id('tgr_B_delete', 'TR') is not NULL
DROP trigger tgr_B_delete
GO
create trigger tgr_B_delete
on B
for delete
as
BEGIN
DECLARE @BID VARCHAR(10)
DECLARE @BINDEX VARCHAR(10)
DECLARE @T TABLE(ID INT,I INT)
INSERT INTO @T SELECT ID,ROW_NUMBER()OVER(ORDER BY GETDATE()) FROM DELETED
SELECT TOP 1 @BID=CAST(ID AS VARCHAR(10)),@BINDEX=I FROM @T ORDER BY I
WHILE @@ROWCOUNT<>0
BEGIN
UPDATE A
SET mm=STUFF(REPLACE(','+mm+',',','+@BID+',',','),1,1,'')
WHERE ','+ mm+',' LIKE '%,'+@BID+',%'
UPDATE A
SET mm=STUFF(mm,LEN(mm),1,'')
WHERE RIGHT(mm,1)=','
DELETE FROM @T WHERE I=@BINDEX
SELECT TOP 1 @BID=CAST(ID AS VARCHAR(10)),@BINDEX=I FROM @T ORDER BY I
END
END
GO