Агрегированное выражение нельзя использовать в предложении WHERE - PullRequest
0 голосов
/ 16 мая 2019

В моей базе данных есть следующие таблицы:

enter image description here

Первая таблица называется Amount, вторая Product, третья Purchase.

А мне надо создать триггер на вставку в таблицу значений.Например, я вставлю следующие значения: 4, 1, 10, где 4 - id_purchase, 1 - id_product, а 4 - количество этих продуктов.И триггер должен вычесть это количество из Amount_On_Stock.В моем примере это должно быть: было 48, стало 38.

Вот код моего триггера:

CREATE TRIGGER AmountInsert ON Amount
AFTER INSERT
AS
BEGIN
    UPDATE Product
    SET Amount_On_Stock = (
            SELECT 
                Amount_On_Stock 
            FROM Product
            WHERE ID_Product = (
                SELECT 
                    MAX(ID_Product) 
                FROM Purchase
                WHERE ID_Purchase = (
                    SELECT 
                        MAX(ID_Purchase) 
                    FROM Purchase
                )
            )
        )-(
            SELECT 
                Amount 
            FROM AMOUNT
            WHERE ID_Product = (
                SELECT 
                    MAX(ID_Product) 
                FROM Purchase
                WHERE ID_Purchase = (
                    SELECT 
                        MAX(ID_Purchase) 
                    FROM Purchase
                )
            )
            )
END

Но когда я пытаюсь создать этот триггер, у меня появляется следующая ошибка:

Агрегированное выражение нельзя использовать в предложении WHERE, если оно не содержится в подзапросе предложения HAVING или в списке выбора, а агрегируемый столбец не является внешней ссылкой.

Итак, как я могу решить эту проблему?

1 Ответ

1 голос
/ 16 мая 2019

Ваш триггер не похож на триггер SQL Server.Я ожидаю, что ваш триггер будет выглядеть примерно так:

CREATE TRIGGER AmountInsert ON Amount AFTER INSERT
AS
BEGIN
    UPDATE p
        SET Amount_On_Stock = p.Amount_On_Stock - i.amount
        FROM Product p JOIN
             inserted i
             ON p.ID_Product = i.ID_Product;
END;

Однако это не будет работать правильно, если у вас есть несколько insert с одним и тем же продуктом одновременно.Чтобы справиться с этим вам нужно агрегирование:

CREATE TRIGGER AmountInsert ON Amount AFTER INSERT
AS
BEGIN
    UPDATE p
        SET Amount_On_Stock = p.Amount_On_Stock - i.amount
        FROM Product p JOIN
             (SELECT i.ID_Product, SUM(i.amount) as amount
              FROM inserted i
              GROUP BY i.ID_Product
             ) i
             ON p.ID_Product = i.ID_Product;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...