SQL Server更新表A从表B中选择部分匹配字符串计数

时间:2012-09-18 17:39:38

标签: sql-server-2008

非常新的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

1 个答案:

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

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