Обновление таблицы SQL из выбора / объединения с несколькими столбцами, требуется только один столбец данных - PullRequest
2 голосов
/ 03 декабря 2010

Во-первых, я довольно плохо знаком с SQL и столкнулся с препятствиями. Я использую систему Mimer SQL.

У меня есть три таблицы: «Транзакции», примерно эквивалентные итоговой сумме, которые я хочу обновить с помощью данных из выборки и таблиц «Товар», содержащих цены и «Продажа», содержащих количество товаров и идентификаторы товаров для данной транзакции, к которой я должен присоединиться, чтобы получить данные для обновления транзакции.

SELECT sale.T_ID, SUM(sale.quantity * item.price) as total
FROM sale
INNER JOIN item
ON sale.I_ID = item.I_ID
GROUP BY T_ID

Дает мне желаемый выбор данных с идентификаторами транзакций и общей суммой для этой транзакции:

T_ID Amount
1    100
2    150
etc...

Я хочу обновить таблицу транзакций, которая содержит столбцы "T_ID" и "Total". Я хочу сопоставить идентификаторы T_ID и обновить итоговую сумму с данными из соответствующей суммы в выборе. Запрос:

UPDATE transaction SET total = (
    SELECT total FROM (
        SELECT sale.T_ID, SUM(sale.quantity * item.price) as total
            FROM sale
            INNER JOIN item
            ON sale.I_ID = item.I_ID
            GROUP BY T_ID)
    WHERE transaction.T_ID=T_ID);

Я чувствую, что вышеприведенное утверждение неверно, но не в состоянии распознать проблему. Как мне составить запрос?

1 Ответ

0 голосов
/ 03 декабря 2010

Выберите только SUM(sale.quantity * item.price) в своем подзапросе и удалите select total один.

update Transaction
    set total = (
        select SUM(sale.quantity * Item.price)
            from Sale
                inner join Item on Sale.I_ID = Item.I_ID
            where Sale.T_ID = Transaction.T_ID
    )

Это то, что я бы попробовал в SQL Server.

Я бы предпочел иметь некоторые примеры данных, чтобы я мог проверить их на моей локальной базе данных SQL Server, чтобы проверить, выполняет ли этот оператор то, что ожидается, хотя вы не используете SQL Server, идея все еще остается то же самое.

РЕДАКТИРОВАТЬ # 1

Несмотря на то, что я не до конца понимаю, почему он не перезаписывает значения в столбцеaction.total, когда транзакция состоит из нескольких различных элементов, предложенный вами запрос работает.

Поведение функции SUM заключается в суммировании всех целевых записей, в результате чего получается только одно скалярное значение для каждой строки Sale и Item. Может быть только одна сумма, не так ли?

При этом он умножает каждую результирующую строку на ограничение, то есть для конкретной транзакции.

  1. Для этой самой транзакции выбираются строки Sale и Item;
  2. Затем он перебирает каждую полученную строку и умножает Sale.Quantity и Item.Price вместе, что стоит значение для каждой строки;
  3. После умножения строки ее сумма добавляется к сумме, которая хранится где-то в памяти;
  4. Как только он обработает все строки для этой транзакции, он получит скалярное значение, которое является суммой всех строк в Sale и Item для данной данной транзакции;
  5. Сумма, равная сумме транзакции.

Другими словами, подзапрос «знает», какую транзакцию суммировать, которая фильтруется в самом подзапросе. Таблица Transaction доступна в подзапросе как часть основного оператора SQL. Таким образом, включение его в предложение where позволяет отфильтровать строки из Sale и Item, которые впоследствии будут умножены и добавлены для итоговой суммы.

Помогает ли это вам лучше понять это заявление об обновлении?

Пожалуйста, не стесняйтесь задавать свои вопросы. =) * * Тысяча пятьдесят одна

...