ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Обновление SQL поля суммой значений из связанной таблицы

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если нужно обновить столбец, используя сумму данных из другой таблицы, можно воспользоваться подзапросом с применением INNER JOIN. В данном случае подход подобен хирургически точной операции:

SQL
Скопировать код
UPDATE main
SET total = (
    SELECT SUM(amount)
    FROM details
    INNER JOIN main ON main.id = details.main_id
    GROUP BY details.main_id
);

Примечание: 'main' — это основная таблица, 'total' — обновляемый столбец, 'details' — таблица, содержащая значения, 'main_id' — ключ, обеспечивающий связь между данными.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Разъяснение приемов работы с подзапросами и агрегатными функциями

Попытка выполнить команду, которая нарушает стандарты SQL, напомнит попытку втиснуть квадратный колышек в круглое отверстие. Применению агрегатных функций, таких как SUM(), в операторе SET предшествует подход, предполагающий использование подзапроса в качестве буфера, для облегчения процесса.

Агрегатные функции в подзапросах

Если попытаться вставить агрегатную функцию непосредственно в SET, SQL может "выдать ошибку". Для устранения этой проблемы можно обернуть функцию в подзапрос:

SQL
Скопировать код
UPDATE main
SET total = (
    SELECT SUM(details.amount)
    FROM details
    WHERE details.main_id = main.id
    ...

Применение группировки для сохранения целостности данных

Применение ключа GROUP BY в подзапросе обеспечивает корректность данных, предотвращая их смешивание:

SQL
Скопировать код
...
    GROUP BY details.main_id
);

Общие табличные выражения (CTE) для улучшения читаемости запросов

Когда запросы становятся слишком обширными и сложными, общие табличные выражения (CTE) позволяют придать им структурированность и удобство чтения:

SQL
Скопировать код
WITH SumDetails AS (
    SELECT main_id, SUM(amount) AS TotalAmount
    FROM details
    GROUP BY main_id
)
UPDATE main
SET total = (
    SELECT TotalAmount
    FROM SumDetails
    WHERE SumDetails.main_id = main.id
);

Примечание: Перед применением CTE убедитесь в поддержке данной функции вашей версией SQL Server.

Лучшие практики SQL

Выделяются несколько профессиональных рекомендаций, соблюдение которых обеспечивает избежание типичных ошибок при работе с SQL.

Корректное сопоставление ключей обеспечивает точность выбора

Правильное сопоставление ключей в операторе JOIN является одним из основных условий успешного формирования запроса:

SQL
Скопировать код
...
INNER JOIN main ON main.id = details.main_id
...

Предварительный просмотр обновлений для безопасности изменений

Чтобы предотвратить ошибки, рекомендуется сначала ознакомиться с будущими изменениями, сформулировав соответствующий SELECT запрос:

SQL
Скопировать код
SELECT main.id, main.total, (SELECT SUM(amount) FROM details WHERE details.main_id = main.id) AS new_total
FROM main
INNER JOIN details ON main.id = details.main_id
GROUP BY main.id;

Визуализация

Для наглядности приведем пример: рассмотрим выписку по банковскому счету (🏦), содержащую различные транзакции (💳):

Markdown
Скопировать код
🏦: [💳(-50), 💳(100), 💳(-20)]

Наша задача: обновить выписку таким образом, чтобы она отражала итоговый баланс (💰):

SQL
Скопировать код
UPDATE BankStatement SET NetBalance = (SELECT SUM(Transaction) FROM Transactions WHERE StatementID = BankStatement.ID);

В результате обновления выписки мы получим чёткое представление о состоянии банковского счета:

Markdown
Скопировать код
🏦: [Итог💰: 30]

Таким образом, обновляя сумму связанных значений, мы преобразовываем перегруженный банковский отчет в четко выраженный баланс счета.

Полезные материалы

  1. Свежие вопросы о 'sql+sum+join' – Stack Overflow — изучите подробности работы с SQL SUM() и JOIN, используя кураторский список обсуждений.
  2. SQL – Агрегатные функции – Tutorials Point — освоите особенности применения агрегатных функций SQL посредством практического руководства.
  3. MEDIAN – Документация Oracle — руководство по использованию агрегатных функций, включая SUM, в Oracle.
  4. Что такое Общее табличное выражение (CTE) – Essential SQL — быстрый курс по освоению CTE в SQL.