非常新的SQL Server,我正在使用SQL Server 2008.我有两个表,表A和表B
我想用表B的匹配字符串的数量更新表A.这是我通过声明静态varchar得出的结果。我想在表A中插入/更新记录的任何时候在表A中的所有记录的过程中执行此操作。
TABLE A: **PO**, Count, Closed Table B: **LD**
24A, 0, 0, 24A-1
25A, 0, 0, 24A-2
26A, 0, 0, 25A-3
26A-1
26A-2
我试过的代码:
Declare @POTableA AS VARCHAR(15)
SET @POTableA = '24A'
Update TABLE A
SET TableA.Count =(Select Count(*) AS 'Count_LD' FROM TABLE B
WHERE TableB.LD LIKE '%'+@POTableA+'-%')
FROM TABLE B WHERE TABLEA.PO LIKE '%'+@POTableA+'%'
目前的结果:
TABLE A: **PO**, Count, Closed Table B: **LD**
24A, 2, 0, 24A-1
25A, 0, 0, 24A-2
26A, 0, 0, 25A-3
26A-1
26A-2
期望的结果:
TABLE A: **PO**, Count, Closed Table B: **LD**
24A, 2, 0, 24A-1
25A, 1, 0, 24A-2
26A, 2, 0, 25A-3
26A-1
26A-2
答案 0 :(得分:0)
虽然我不确定为什么需要将计数保存在表A中 - 您总是可以在运行时确定此计数,然后您不必使用触发器等来维护该信息(这是多余的) 。但是这里是一个使用表变量的演示,关于如何实现这样的聚合更新(可能还有其他方法)。
DECLARE @A TABLE(PO VARCHAR(32), [count] INT);
DECLARE @B TABLE(LD VARCHAR(32));
INSERT @A VALUES
('24A',0), ('25A',0), ('26A',0);
INSERT @B VALUES
('24A-1'), ('24A-2'), ('25A-3'),
('26A-1'), ('26A-2');
UPDATE T
SET T.[count] = S.[count]
FROM @A AS T
INNER JOIN
(
SELECT A.PO, [count] = COUNT(B.LD)
FROM @A AS A INNER JOIN @B AS B
ON B.LD LIKE A.PO + '%'
GROUP BY A.PO
) AS S
ON T.PO = S.PO;
SELECT PO, [count] FROM @A;
结果:
PO count
---- -----
24A 2
25A 1
26A 2
现在,如果您需要在触发器中执行此操作,则类似于:
CREATE TRIGGER dbo.MaintainRedundantCount
ON dbo.TableB
FOR INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE T
SET T.[count] = S.[count]
FROM dbo.TableA AS T
INNER JOIN
(
SELECT A.PO, [count] = COUNT(B.LD)
FROM dbo.TableA AS A
INNER JOIN dbo.TableB AS B
ON B.LD LIKE A.PO + '%'
GROUP BY A.PO
) AS S
ON T.PO = S.PO;
END
GO
您可能希望将其中一行修改为:
ON B.LD LIKE A.PO + '-%'
但是,由于您在问题中只提供了三个样本值,并且它们的格式完全相同,因此很难说出您的真实数据集是什么样的。