私は3つのテーブルを持っています:
- キット (kit_id、kit_weight)
- Kit_Components (キット ID、数量、コンポーネント ID)
- コンポーネント (component_id、重量)
キット テーブルの各エントリには、1 つ以上の Kit_Component エントリが存在する場合があります。各コンポーネントには、まだ重み付けしていない場合は重みまたは null のいずれかになる重み列があります。私がする必要があるのは、SQLクエリを実行して、すべてのコンポーネントの合計重量×数量に基づいてKitsテーブルの重量列を更新するか、重量のいずれかがnullの場合はその値をnullに設定することですが、よくわかりません可能ですよね?
注: スクリプト、トリガー、または手順は避けたいと思います。コンポーネントが保存されたとき、またはキットが更新されたときにこれを行うコードがありますが、これを一括で実行できるようにしたいと考えています。
編集:さらに明確にするために、重み*数量を合計できますが、NULLはSUMで0として機能するため、これはNULLであるコンポーネント行を処理しません(私はこれをテストしました)
たとえば、Kit1 には、重みが 14 の 1xComponentA と、重みが NULL の 2xComponentB があります。
SELECT kit_id, SUM(component.weight * kit_component.quantity) FROM kit_component INNER JOIN component ON kit_component.component_id = component.id GROUP BY kit_component.kit_id
これは kit1 に対して 14 を返しますが、ComponentB には重みがないため、代わりに NULL を返す必要があるため、これは誤りです。
Hugo Kornelis : 「(GROUP BY によって形成された) グループ内のデータに NULL と非 NULL データがある場合、NULL は無視され、結果は残りの数値の合計になります: SUM {1, 3, NULL, 5} = SUM {1, 3, 5} = 9 グループ内のすべてのデータが NULL の場合、NULL も無視され、合計される行はまったく残されません: 結果は空のセットの合計です; 定義によりこれは NULL です。SUM {NULL, NULL} = SUM {} = NULL."