я написал этот MySQL хранимой процедуру (Полную процедуру в конце вопроса), и это дает мне ошибку в следующих утверждениях:MySQL: не удается получить доступ к временной таблице
UPDATE TrialBalTbl
SET totalCred = (SELECT SUM(DISTINCT L1CredSUM) FROM TrialBalTbl),
totalDeb = (SELECT SUM(DISTINCT L1DebSUM) FROM TrialBalTbl);
была ошибкой:
не удается открыть заново таблицу
(TrialBalTbl
это временная таблица) Я искал над ним и нашел that
Вы не можете обратиться к ВРЕМЕННОЙ таблице более чем один раз в одном запросе
Так я думал использовать псевдоним tbal
для временной таблицы TrialBalTbl
для достижения эффекта и пришел с этим:
UPDATE TrialBalTbl as tbal
SET totalCred = (SELECT SUM(DISTINCT L1CredSUM) FROM tbal),
totalDeb = (SELECT SUM(DISTINCT L1DebSUM) FROM tbal);
Теперь, к сожалению, это тоже не сработает. Это говорит
Таблица «digitalmanager.tbal» не существует
Может кто-нибудь пожалуйста, скажите мне, что случилось с ним? И как я могу заставить это работать? Вот моя полная хранимая процедура, которая работает до этого UPDATE
заявления:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `Trial_Balance`(IN startDate Varchar(200), IN endDate Varchar(200))
BEGIN
DROP TABLE IF EXISTS digitalmanager.TrialBalTbl;
CREATE TEMPORARY TABLE TrialBalTbl (
CTR INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
PARTY_ID VARCHAR(100),
ACCOUNT_ID VARCHAR(100),
PARTY_NAME VARCHAR(500),
DEBIT DECIMAL(19,2),
CREDIT DECIMAL(19,2),
L1 VARCHAR(200),
L1NAME VARCHAR(1000),
L2 VARCHAR(200),
L2NAME VARCHAR(1000),
L3 VARCHAR(200),
L3NAME VARCHAR(1000),
L1DebSUM decimal(19,2),
L1CredSUM decimal(19,2),
L2DebSUM decimal(19,2),
L2CredSUM decimal(19,2),
L3DebSUM decimal(19,2),
L3CredSUM decimal(19,2),
totalCred decimal(19,2),
totalDeb decimal(19,2)
);
INSERT INTO TrialBalTbl
SELECT
null,
P.PARTY_ID,
P.ACCOUNT_ID,
P.NAME,
SUM(L.DEBIT)-SUM(L.CREDIT),
0,
l1.L1,
l1.`name` AS 'L1NAME',
l2.L2,
l2.`name` AS 'L2NAME',
l3.L3,
l3.`name` AS 'L3NAME',
0,
0,
0,
0,
0,
0,
0,
0
FROM
PLEDGER AS L INNER JOIN PARTY AS P ON L.party_id = p.party_id
INNER JOIN level3 AS l3 ON l3.l3 = p.level3
INNER JOIN level2 AS l2 ON l2.l2 = l3.l2
INNER JOIN level1 AS l1 ON l1.l1 = l2.l1
WHERE
DATE(L.VRDATE) BETWEEN startDate AND endDate
GROUP BY
l1.L1, l2.L2, l3.L3, P.PARTY_ID,P.NAME
HAVING IFNULL(SUM(L.DEBIT),0)-IFNULL(SUM(L.CREDIT),0) >0
order by
P.ACCOUNT_ID ASC;
INSERT INTO TrialBalTbl
SELECT
null,
P.PARTY_ID,
P.ACCOUNT_ID,
P.NAME,
0,
SUM(L.CREDIT)-SUM(L.DEBIT),
l1.L1,
L1.NAME AS 'L1NAME',
l2.L2,
L2.NAME AS 'L2NAME',
l3.L3,
L3.NAME AS 'L3NAME',
0,
0,
0,
0,
0,
0,
0,
0
FROM
PLEDGER AS L INNER JOIN PARTY AS P ON L.party_id = p.party_id
INNER JOIN level3 AS l3 ON l3.l3 = p.level3
INNER JOIN level2 AS l2 ON l2.l2 = l3.l2
INNER JOIN level1 AS l1 ON l1.l1 = l2.l1
WHERE
DATE(L.VRDATE) BETWEEN startDate AND endDate
GROUP BY
l1.L1, l2.L2, l3.L3, P.PARTY_ID,P.NAME HAVING IFNULL(SUM(L.CREDIT),0)-IFNULL(SUM(L.DEBIT),0) > 0
ORDER BY
P.ACCOUNT_ID ASC;
-- Update the whole level's credit and debit sums
UPDATE TrialBalTbl as tbal
SET L1DebSUM = (
SELECT SUM(PLEDGER.DEBIT)-SUM(PLEDGER.CREDIT)
FROM
PLEDGER INNER JOIN PARTY ON PLEDGER.PARTY_ID = PARTY.PARTY_ID
INNER JOIN Level3 ON level3.l3 = Party.level3
INNER JOIN Level2 ON Level3.l2 = level2.l2
INNER JOIN Level1 on Level1.l1 = level2.l1
WHERE
level1.l1 = tbal.l1 AND DATE(PLEDGER.VRDATE) BETWEEN startDate AND endDate
GROUP BY
level1.L1
HAVING
IFNULL(SUM(PLEDGER.DEBIT),0)-IFNULL(SUM(PLEDGER.CREDIT),0) > 0
);
UPDATE TrialBalTbl as tbal
SET L1CredSUM = (
SELECT SUM(PLEDGER.CREDIT) -SUM(PLEDGER.DEBIT)
FROM
PLEDGER INNER JOIN PARTY ON PLEDGER.PARTY_ID = PARTY.PARTY_ID
INNER JOIN Level3 ON level3.l3 = Party.level3
INNER JOIN Level2 ON Level3.l2 = level2.l2
INNER JOIN Level1 on Level1.l1 = level2.l1
WHERE
level1.l1 = tbal.l1 AND DATE(PLEDGER.VRDATE) BETWEEN startDate AND endDate
GROUP BY
level1.L1
HAVING
IFNULL(SUM(PLEDGER.CREDIT),0)-IFNULL(SUM(PLEDGER.DEBIT),0) > 0
);
UPDATE TrialBalTbl as tbal
SET L2DebSUM = (
SELECT SUM(PLEDGER.DEBIT)-SUM(PLEDGER.CREDIT)
FROM
PLEDGER INNER JOIN PARTY ON PLEDGER.PARTY_ID = PARTY.PARTY_ID
INNER JOIN Level3 ON level3.l3 = Party.level3
INNER JOIN Level2 ON Level3.l2 = level2.l2
INNER JOIN Level1 on Level1.l1 = level2.l1
WHERE
level1.l1 = tbal.l1 AND level2.l2 = tbal.l2 AND DATE(PLEDGER.VRDATE) BETWEEN startDate AND endDate
GROUP BY
level1.L1, level2.L2
HAVING
IFNULL(SUM(PLEDGER.DEBIT),0)-IFNULL(SUM(PLEDGER.CREDIT),0) > 0
);
UPDATE TrialBalTbl as tbal
SET L2CredSUM = (
SELECT SUM(PLEDGER.CREDIT) -SUM(PLEDGER.DEBIT)
FROM
PLEDGER INNER JOIN PARTY ON PLEDGER.PARTY_ID = PARTY.PARTY_ID
INNER JOIN Level3 ON level3.l3 = Party.level3
INNER JOIN Level2 ON Level3.l2 = level2.l2
INNER JOIN Level1 on Level1.l1 = level2.l1
WHERE
level1.l1 = tbal.l1 AND level2.l2 = tbal.l2 AND DATE(PLEDGER.VRDATE) BETWEEN startDate AND endDate
GROUP BY
level1.L1, level2.L2
HAVING
IFNULL(SUM(PLEDGER.CREDIT),0)-IFNULL(SUM(PLEDGER.DEBIT),0) > 0
);
UPDATE TrialBalTbl as tbal
SET L3DebSUM = (
SELECT SUM(PLEDGER.DEBIT)-SUM(PLEDGER.CREDIT)
FROM
PLEDGER INNER JOIN PARTY ON PLEDGER.PARTY_ID = PARTY.PARTY_ID
INNER JOIN Level3 ON level3.l3 = Party.level3
INNER JOIN Level2 ON Level3.l2 = level2.l2
INNER JOIN Level1 on Level1.l1 = level2.l1
WHERE
level1.l1 = tbal.l1 AND level2.l2 = tbal.l2 AND level3.l3 = tbal.l3 AND DATE(PLEDGER.VRDATE) BETWEEN startDate AND endDate
GROUP BY
level1.L1, level2.L2, level3.L3
HAVING
IFNULL(SUM(PLEDGER.DEBIT),0)-IFNULL(SUM(PLEDGER.CREDIT),0) > 0
);
UPDATE TrialBalTbl as tbal
SET L3CredSUM = (
SELECT SUM(PLEDGER.CREDIT) -SUM(PLEDGER.DEBIT)
FROM
PLEDGER INNER JOIN PARTY ON PLEDGER.PARTY_ID = PARTY.PARTY_ID
INNER JOIN Level3 ON level3.l3 = Party.level3
INNER JOIN Level2 ON Level3.l2 = level2.l2
INNER JOIN Level1 on Level1.l1 = level2.l1
WHERE
level1.l1 = tbal.l1 AND level2.l2 = tbal.l2 AND level3.l3 = tbal.l3 AND DATE(PLEDGER.VRDATE) BETWEEN startDate AND endDate
GROUP BY
level1.L1, level2.L2, level3.L3
HAVING
IFNULL(SUM(PLEDGER.CREDIT),0)-IFNULL(SUM(PLEDGER.DEBIT),0) > 0
);
-- PROBLEM here.
UPDATE TrialBalTbl
SET totalCred = (SELECT SUM(DISTINCT L1CredSUM) FROM TrialBalTbl),
totalDeb = (SELECT SUM(DISTINCT L1DebSUM) FROM TrialBalTbl);
SELECT * FROM TrialBalTbl ORDER BY ACCOUNT_ID;
END
@Malimovka да. Должен быть какой-то способ достичь этого. Я ** использовал ** тот же способ, чтобы обновить эту временную таблицу выше, и это сработало, но не работает над указанным утверждением. –
Я думаю, что это может быть связано с группировкой (используя 'DISTINCT' в' SUM'). – AeroX
Невозможно обойти это ограничение (помимо обновления до СУБД, которая не накладывает ограничений) - и даже если вы можете дважды использовать таблицу temp, вам не разрешено использовать таблицу, которую вы обновляете в подпункте -выберите, если я не ошибаюсь. –