1

非常に新しい SQL Server で、SQL Server 2008 を使用しています。テーブル A とテーブル B の 2 つのテーブルがあります。

テーブル A を、テーブル B の一致する文字列の数で更新したいと考えています。これは、静的 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

これらの行の 1 つを次のように変更することができます。

       ON B.LD LIKE A.PO + '-%'

しかし、質問では 3 つのサンプル値しか与えておらず、それらはすべてまったく同じ形式だったため、実際のデータ セットがどのように見えるかを判断するのは困難です。

于 2012-09-18T17:51:41.427 に答える