1

非常新的 SQL Server,我使用的是 SQL Server 2008。我有两个表,表 A 和表 B

我想用表 B 的匹配字符串的计数来更新表 A。这是我通过声明静态 varchar 得出的结果。每当在表 B 中插入/更新记录时,我希望它在表 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
4

1 回答 1

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 + '-%'

但是由于您在问题中只提供了三个样本值,而且它们的格式都完全相同,因此很难说出您的真实数据集是什么样的。

于 2012-09-18T17:51:41.427 回答