2011-07-05 7 views
1

저는 입니다. join 문을 사용하여 테이블을 업데이트하려고하는데을 시도하고 있지만 정확하게 작동하지 않습니다. 하나의 조건이 참일 때 다른 테이블의 데이터를 사용하여 데이터베이스의 특정 행을 업데이트 할 수 있어야합니다. 내가 지금까지 가지고있는 것은 무엇인가? 아마 내가 가깝고 누군가 통찰력을 제공 할 수 있을까?SQL 조인과 업데이트를 함께 사용하기

UPDATE Project 
    SET Project.SumAssessments = SUM (Assessment.Amount) 
FROM Project 
JOIN Assessment ON Project.SumAssessments = SUM (Assessment.Amount) 
WHERE Assessment.ProjectCode = @ProjectID 
    AND Project.ProjectID = @ProjectID 
+0

어떤 오류 메시지가 나타나나요? –

+1

어떤 DBMS입니까? 그리고 * 정확하게 작동하지 않습니다 * 내가 일한 DBMS에서 본 오류 메시지가 아닙니다. 정확히 작동하지 않는 것은 무엇입니까? –

+0

이렇게하면 ... 모든 줄에 총계 열이 있습니까? 그러면 같은 테이블의 합계가 저장됩니까? 아마도 테이블 디자인에 약간의 리팩토링이 필요할까요? –

답변

5

첫째, 나는 전체적으로 열을 없애 버릴 것입니다. 적절한 데이터베이스 설계의 가장 기본적인 규칙 중 하나를 위반합니다. 데이터베이스에서 데이터를 복제하지 마십시오. 거의 항상 동기화되지 않고 끝나기 때문에 추가 유지 관리 및 관리가 필요합니다. VERY 희귀 한 경우입니다. 당신이 생각한다고해도, 당신이 처한 상황은 거의 확실합니다. 적절한 인덱싱을 사용하면 해당 열을 필요가 없습니다.

둘째, SUM에 기반한 평가 테이블에 가입 할 필요가 없습니다. 프로젝트 코드를 기반으로 이미 가입하고 있습니다. 해당 조건이 속한 ON 절에 해당 조건을 넣지 않았습니다. 심지어 더 나은, 당신은 단지 GROUP BY에 대한 필요성을 피하기 위해 하위 쿼리를 사용할 수 있습니다. 당신이 기본 키 (ProjectId)라고 생각하는 것을 사용하고 있기 때문에 하위 쿼리가 잘 수행되어야합니다.

UPDATE Project 
SET Project.SumAssessments = (
     SELECT SUM (Assessment.Amount) 
     FROM Assessment 
     WHERE ProjectCode = @ProjectID 
     ) 
FROM Project 
WHERE Project.ProjectID = @ProjectID 
+0

당신은 정확합니다, 도움을 주셔서 감사합니다! 나는 SQL에 익숙하지 않기 때문에 이러한 개념은 나에게 매우 새로운 것이다. – exogenic

1

나는 당신이 SumAssessments 열을 업데이트하려는 가정이, 그것의 기반으로 쿼리하지, 그래서 SUM 함수는 가입 절에 나타나지 않아야합니다. 전혀 가입 할 필요가 없으며 이러한 '합계'열이 나쁜 아이디어 임에도 불구하고 원하는 결과를 얻을 수있는 방법은 다음과 같습니다.

UPDATE Project set SumAssessments = (
    select SUM(Amount) from Assessments where ProjectCode = @ProjectID 
) 
where ProjectID = @ProjectID 
관련 문제