Обновление таблицы MySQL из подзапроса / объединенной таблицы - PullRequest
0 голосов
/ 05 декабря 2018

Я видел много вопросов по этому вопросу, но не могу заставить это работать.Я хочу ОБНОВИТЬ несколько столбцов в таблице (но начну с одного) на основе вычисленного значения из той же таблицы.
Это список транзакций на одного клиента в месяц.

TransID | Cust | Month      | Value | PastValue | FutureValue
      1 |    1 | 2018-01-01 |    45 |
      2 |    1 | 2018-02-01 |     0 |  
      3 |    1 | 2018-03-01 |    35 |
      4 |    1 | 2018-04-01 |    80 |

.

UPDATE tbl_transaction a
SET PrevMnthValue = 
(SELECT COUNT(TransactionID) FROM tbl_transaction b WHERE b.Cust=a.Cust AND b.Month<a.Month)

Но мы получаем страшное: «Не удается обновить таблицу с помощью оператора where с подзапросом к той же таблице).

Я пытался вложить подзапрос, как этотбыл объявлен как обходной путь:

UPDATE tbl_transactions a 
SET 
    PastValue = 
        (
            SELECT CNT FROM
                (
                    SELECT 
                    COUNT(TransactionID) AS CNT
                    FROM tbl_transactions b
                    WHERE
                        b.CustomerRef=a.CustomerRef AND b.Month<a.Month
                ) x
        ),
    FutureValue = 
        (
            SELECT CNT FROM
                (
                    SELECT 
                    COUNT(TransactionID) AS CNT
                    FROM tbl_transactions b
                    WHERE
                        b.CustomerRef=a.CustomerRef AND b.Month>a.Month
                ) x
        )

Но я получаю НЕИЗВЕСТНЫЙ a.CustomerRef в предложении WHERE.Куда я иду не так?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Вы не можете обновлять и читать из одной таблицы одновременно.В документации MySQL говорится об этом

Невозможно обновить таблицу и выбрать из этой же таблицы в подзапросе .

Сначала необходимо выбрать необходимоеданные и сохраните их где-нибудь, например, во временную таблицу

CREATE TEMPORARY TABLE IF NOT EXISTS `temp` AS (
   SELECT 
     COUNT(`TransactionID`) AS CNT,
     `CustomerRef`,
     `Month`
   FROM `tbl_transactions`
   GROUP BY `Custom,erRef`, `Month`
);

После этого вы можете использовать оператор JOIN для таблицы обновления

UPDATE `tbl_transactions` RIGTH
JOIN `temp` ON `temp`.`CustomerRef` = `tbl_transactions`.`CustomerRef`
AND `temp`.`Month` < `tbl_transactions`.`Month`
SET `tbl_transactions`.`PastValue` = `temp`.`cnt`

ОБНОВЛЕНО: Если вы хотите обновить несколько столбцов в зависимости от условий, вы можете объединить временную таблицу, UPDATE + RIGHT JOIN и оператор CASE .Например:

UPDATE `tbl_transactions`
RIGTH JOIN `temp` ON `temp`.`CustomerRef` = `tbl_transactions`.`CustomerRef` 
SET `tbl_transactions`.`PastValue` = CASE
    WHEN `temp`.`Month` < `tbl_transactions`.`Month` THEN `temp`.`cnt`
    ELSE `tbl_transactions`.`PastValue`
END, 
`tbl_transactions`.`FutureValue` = CASE
    WHEN `temp`.`Month` > `tbl_transactions`.`Month` THEN `temp`.`cnt`
    ELSE `tbl_transactions`.`FutureValue`
END
0 голосов
/ 05 декабря 2018

Вы можете попробовать ниже

UPDATE tbl_transactions a 
Join
( SELECT CustomerRef,COUNT(TransactionID) AS CNT FROM tbl_transactions b 
group by CustomerRef)x
SET PastValue = CNT 
WHERE x.CustomerRef=a.CustomerRef AND x.Month<a.Month
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...