I have 2 Sqlite tables, lets call them main and sub.
Main has a field which should be the sum of all values with the same code in the sub table.
so if Main has
CODE | TOTAL_UNITS_AVAILABLE
1 3
2 5
Then it means in sub there's something like this
INGREDIENT_CODE | UNITS_AVAILABLE
1 1
1 2
2 5
I have triggers on sub for INSERT, UPDATE and DELETE which update the value of TOTAL_UNITS_AVAILABLE in Main for the record with the code that was inserted/updated/deleted on sub
Insert and update work fine, but DELETE has a problem where if every record in sub with an X main code gets deleted, the sum of amount in main gets updated to NULL.
I tried the following to prevent it but it's not working:
CREATE TRIGGER UpdateAmountAvailable_UPDATE
AFTER DELETE ON Sub
BEGIN
UPDATE Main
SET
TOTAL_UNITS_AVAILABLE = (
SELECT
CASE SUM(A.UNITS_AVAILABLE)
WHEN NULL THEN 0
WHEN 0 THEN 0
ELSE SUM(A.UNITS_AVAILABLE)
END
FROM Sub AS A
WHERE A.INGREDIENT_CODE = old.INGREDIENT_CODE
) WHERE CODE = old.INGREDIENT_CODE;
END
Is there any workaround I could try?
CodePudding user response:
Sqlite has a non-standard aggregate function TOTAL
The sum() and total() aggregate functions return sum of all non-NULL values in the group. If there are no non-NULL input rows then sum() returns NULL but total() returns 0.0.
CREATE TRIGGER UpdateAmountAvailable_DELETE
AFTER DELETE ON Sub
BEGIN
UPDATE Main
SET TOTAL_UNITS_AVAILABLE = (
SELECT TOTAL(A.UNITS_AVAILABLE)
FROM Sub AS A
WHERE A.INGREDIENT_CODE = old.INGREDIENT_CODE
)
WHERE CODE = old.INGREDIENT_CODE;
END
The same using the standard SUM function would be COALESCE(SUM(A.UNITS_AVAILABLE), 0)
