1

レコードのあるテーブルがあります

create table rstbljobs  
(  
AutoID identity(1,1),  
AssignedToRstEmpID int,  
priorityid int,  
Jobstatusid int  
)


Insert into rstbljobs values ( 147,202,374)  
Insert into rstbljobs values ( 169,214,374)  
Insert into rstbljobs values ( 170,202,374)  
Insert into rstbljobs values ( 176,202,374)  
Insert into rstbljobs values ( 182,202,374)  
Insert into rstbljobs values ( 147,214,374)  
Insert into rstbljobs values ( 183,202,374)  
Insert into rstbljobs values ( 170,214,374)  
Insert into rstbljobs values ( 182,214,374)  
Insert into rstbljobs values ( 170,202,374)  
Insert into rstbljobs values ( 147,214,374)  
Insert into rstbljobs values ( 147,202,374)  
Insert into rstbljobs values ( 169,202,374)  
Insert into rstbljobs values ( 169,214,374)  

私は別のテーブルUsersRSDeskを持っています

Create table UsersRSDesk  
(  
userid int,  
IsRecruit bit,  
status bit,  
noofhighprtjobs varchar(50)  
)

記録は

insert into UsersRSDesk values (147,1,0,null)  
insert into UsersRSDesk values (169,1,0,null)  
insert into UsersRSDesk values (170,1,0,null)  
insert into UsersRSDesk values (176,1,0,null)  
insert into UsersRSDesk values (182,1,0,null)  
insert into UsersRSDesk values (183,1,0,null)  

クエリは次のとおりです。

select AssignedToRstEmpID,COUNT(AssignedToRstEmpID)as Noofcount from RStblJobs 
group by AssignedToRstEmpID

上記のクエリから、rstbljobs の noofcount を usersrsdesk.noofhighprtjobs 列に挿入する必要があります。rstbljobs テーブルを更新するたびに、同じカウントがここに反映されるはずです。

4

1 に答える 1

0

短い答えは、おそらくすべきではないということです。計算された値を格納することは、通常、OLTP データベースでは適切な方法ではありません (OLAP ではごく普通のことです)。代わりに、これが定期的にアクセスする必要がある数値である場合は、ビューの作成を検討する必要があります。

CREATE VIEW dbo.UserJobs
AS
    SELECT  AssignedToRstEmpID,
            Noofcount = COUNT(AssignedToRstEmpID) 
    FROM    RStblJobs 
    GROUP BY AssignedToRstEmpID;

次に、このビューを使用して、次のようにカウントを取得できます。

SELECT  *
FROM    UsersRSDesk
        LEFT JOIN dbo.UserJobs
            ON UserJobs.AssignedToRstEmpID = UsersRSDesk.userid;

これがパフォーマンスの低下になると予想される場合は、インデックス付きビューを作成できます。

CREATE VIEW dbo.UserJobs
WITH SCHEMABINDING
AS
    SELECT  AssignedToRstEmpID,
            Noofcount = COUNT_BIG(*) 
    FROM    dbo.RStblJobs 
    GROUP BY AssignedToRstEmpID;

GO
CREATE UNIQUE CLUSTERED INDEX IX_UserJobs_AssignedToRstEmpID 
  ON dbo.UserJobs (AssignedToRstEmpID);

インデックス付きビューでは、カウントはクラスター化インデックスに格納されますが、インデックスを確実に使用するにはNOEXPANDヒントを使用する必要があります。

SELECT  *
FROM    UsersRSDesk
        LEFT JOIN dbo.UserJobs (NOEXPAND)
            ON UserJobs.AssignedToRstEmpID = UsersRSDesk.userid;

SQLFiddle の例

于 2013-09-20T15:28:37.223 に答える