2010-02-08 4 views
0

나는 여러 테이블의 행에서 총합을 가정하는 내 테이블 중 하나에 열이 있습니다. 거기에 총계 열에 대해 실행되는 기본 쿼리를 가질 수있는 방법이 있으므로 행이 다른 테이블에 추가 될 때마다 업데이트가 총계 열에서 이루어집니다. 당신은 대신에 테이블의 뷰를 사용하여보고 할 수 있습니다테이블의 열에 대한 기본 쿼리 만들기 (SQL)?

감사

답변

1

당신은 총합 열 때마다 다른 테이블의 열 중 하나를 업데이트 할이 변경됩니다? 그러면 방아쇠가 귀하의 목적을 달성 할 수 있습니다.

Create Trigger For Insert, Update, Delete 
    On OtherTable 
    As 
     Update SumTable Set 
      SumColumn = 
       (Select Sum(Column) 
       From OtherTable 
       Where something = s.Something) 
     From SumTable s 
     Where Something In 
      (Select Distinct something From inserted 
       Union 
      Select Distinct Something From deleted) 

또는 별도의 트리거를 작성하여 삽입 또는 갱신의 코드에서 삭제에 대한 코드를 분리, 또는으로 할 수 있습니다

Create Trigger For Insert, Update, Delete 
    On OtherTable 
    As 
     If Exists(Select * From inserted) And Update(Column) 
      Update SumTable Set 
       SumColumn = 
        (Select Sum(Column) 
        From OtherTable 
        Where something = s.Something) 
      From SumTable 
      Where Something In 
       (Select Distinct Something 
       From Inserted) 
     Else If Exists(Select * From deleted)    
      Update SumTable Set 
       SumColumn = 
        (Select Sum(Column) 
        From OtherTable 
        Where something = s.Something) 
      From SumTable 
      Where Something In 
       (Select Distinct Something 
       From deleted) 
+0

안녕하세요 Charles는 답변을 주셔서 감사합니다. 그러나 저는 당신이 어디에서 무엇을하고 있는지 이해하지 못했습니다. 어디 에서 뭔가 (삭제 구별 뭔가를 선택 삽입 연합 (EU)과 차별화 된 무언가를 선택) – Shino88

+0

I 절은 행만 곳으로 업데이트를 제한하는 것이었다 업데이트 모두/삽입과 삭제를위한 하나의 트리거를 사용하여 이후 something 열의 값이 삽입, 업데이트 또는 삭제되는 행에 있습니다. 이렇게하면 SumTable의 모든 행에 대해 SumColumn을 업데이트하지 못하도록 트리거를 중지하고 업데이트해야하는 행만 업데이트합니다 (자식 행이 삽입, 업데이트 또는 삭제되었습니다.) - 두 개의 시나리오를 개별적으로 처리하기 위해 separte 코드 블록을 추가했습니다. –

2

는 다음과 같은 뭔가 도움이 될 수 있습니다.

Select table.*, sum(otherTable.column) 
from table 
inner join otherTable on table.something = otherTable.something 
1

찰스가 말했듯이, 트리거이 잘 작동 상태. 그러나 다른 테이블의 행 합계가 자주 변경되는 경우 트리거가 성능 문제를 일으키는 지 확실하지 않습니다. 두 가지 다른 접근 방식이 있습니다 :

보기 -보기는 본질적으로 저장된 쿼리이므로 테이블과 마찬가지로 쿼리 할 수 ​​있습니다. 합계 데이터가보고 유형 항목에만 필요한 경우 주 테이블에서 합계 열을 제거하고보고 용보기를 사용하는 것이 더 나을 수 있습니다.

저장 프로 시저 - 주 테이블에 열을 유지하려는 경우 모든 행에 대한 요약 정보를 최신 상태로 유지하는 저장 프로 시저를 정기적으로 실행할 수 있습니다.

+0

트리거에 대한 메모를 위해 특별히 메모를 upvoted했습니다. –

0

사용할 아이디어를 결정하기 전에보기 아이디어와 트리거 아이디어 사이의 성능을 비교할 것입니다. 작은 데이터 세트 만이 아니라보기에 필요한 전체 데이터 세트에 대해이 작업을 수행하십시오. 가능한 경우보기를 색인화하십시오.

관련 문제