2011-07-05 11 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

まず、完全に列を削除します。適切なデータベース設計の最も基本的なルールの1つに違反します。データベース内のデータを複製しないでください。ほとんどの場合、同期が外れてしまうため、余分な保守と管理が必要になる場合もあります。 VERYこれに違反することがあるまれなケースがあります。たとえそうだとしても、あなたの状況はほとんど確実にそうしたケースの1つではありません。適切な索引付けを行うと、その列は必要ありません。

第2に、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

私はあなたがそれのオフに基づいてクエリではないので、SUM関数は、あなたのJOIN句には表示されません、SumAssessments列を更新しようとしていると仮定しなければなりません。あなたはまったく参加する必要はありません。これらの「合計」列は悪い考えですが、あなたが望むものを達成する方法は次のとおりです。

UPDATE Project set SumAssessments = (
    select SUM(Amount) from Assessments where ProjectCode = @ProjectID 
) 
where ProjectID = @ProjectID 
関連する問題