Запрос рефакторинга: невозможно повторно открыть таблицу в MySql - PullRequest
0 голосов
/ 28 мая 2020

Вот моя хранимая процедура:

CREATE DEFINER=`root`@`localhost` PROCEDURE `total_dr_cr`(yr varchar(64), effDate varchar(64))
BEGIN

DECLARE cursor_level INT;
DECLARE level_done INT DEFAULT FALSE;
DECLARE c_level CURSOR FOR SELECT glAccountLevelId FROM gl_accounts WHERE isDeleted = 0 GROUP BY glAccountLevelId ORDER BY glAccountLevelId DESC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET level_done = TRUE;

DROP TEMPORARY TABLE IF EXISTS temp_gl_account_totals;

CREATE TEMPORARY TABLE temp_gl_account_totals (glId int(11), level int(11), parentId int(11), glAccount varchar(255), title varchar(255), drAmount double(12,2), crAmount double(12,2));

INSERT INTO temp_gl_account_totals (glId, level, parentId, glAccount, title, drAmount, crAmount)
SELECT gl.id, gl.glAccountLevelId, gl.parentId, gl.account, gl.title, 0 as dr, 0 as cr
FROM gl_accounts gl
WHERE isDeleted = 0
GROUP BY gl.id;

OPEN c_level;

read_loop: LOOP

FETCH c_level INTO cursor_level;

IF level_done THEN
    LEAVE read_loop;
END IF;

UPDATE temp_gl_account_totals totals
INNER JOIN (
    SELECT
    gl.id AS id,
    gl.parentId,
    gl.account,
    gl.title,
    (
        IFNULL(SUM(led.drTotalAmount), 0)
        +
        (
            SELECT IFNULL(SUM(drAmount), 0)
            FROM temp_gl_account_totals gls
            WHERE gls.parentId = gl.id
        )
    ) AS dr,
    (
        IFNULL(SUM(led.crTotalAmount), 0)
        +
        (
            SELECT IFNULL(SUM(crAmount), 0)
            FROM temp_gl_account_totals gls
            WHERE gls.parentId = gl.id
        )
    ) AS cr
    FROM gl_accounts gl
    LEFT JOIN general_ledgers led ON led.glAccountId = gl.id AND led.isDeleted = 0 AND YEAR(led.effectiveDate) = yr AND IF(effDate <> '', DATE(led.effectiveDate), '') = effDate
    WHERE gl.glAccountLevelId = cursor_level
    AND gl.isDeleted = 0
    GROUP BY gl.id
) x ON x.id = totals.glId
SET
totals.drAmount = x.dr,
totals.crAmount = x.cr
WHERE totals.level = cursor_level;

END LOOP;

SELECT * FROM temp_gl_account_totals;

CLOSE c_level;


END

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

Только пример:

id     |      parentId      |      level      |      amount
1      |      0             |      1          |      100
2      |      1             |      2          |      50
3      |      2             |      3          |      50
4      |      1             |      2          |      50
5      |      4             |      3          |      50
  • В id = 1 у нас есть 100, потому что мы суммируем его двух дочерних элементов, что составляет 50 + 50
  • В id = 2 и id = 4 мы имеет 50, потому что мы суммируем его дочерний элемент, который равен 50

Часть, где я выбираю temp_gl_account_totals, является причиной ошибки:

Есть ли способ не использовать ту же таблицу, но создает такой же результат?

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...