我一直在嘗試創建一個INSERT 觸發器,在一個簡單的觸發器主體中,我可以很好地訪問“新”表。
但是在一個示例中,“新”表被更深入地使用到正文中,它不再找到我需要的列。
我可以在以下位置找到“NEW.nr_legitimatie”列:
CREATE DEFINER=`root`@`localhost`
TRIGGER `calculMedie`
AFTER INSERT ON `note`
FOR EACH ROW
INSERT INTO medii (MEDII.nr_legitimatie, MEDII.medie_generala, medii.medie_an1, medii.medie_an2, medii.medie_an3)
VALUES (new.nr_legitimatie, 1, 2, 3, 4)
我無法再在以下位置找到“NEW.nr_legitimatie”列:
CREATE DEFINER=`root`@`localhost`
TRIGGER `calculMedie`
AFTER INSERT ON `note`
FOR EACH ROW
INSERT INTO medii (MEDII.nr_legitimatie, MEDII.medie_generala, medii.medie_an1, medii.medie_an2, medii.medie_an3)
WITH date AS (
WITH medii_pe_coloane AS (
SELECT medie1.nr_legitimatie,
AVG(medie1.maxim) as medie_an_1,
AVG(medie2.maxim) as medie_an_2,
AVG(medie3.maxim) as medie_an_3
FROM
(
SELECT nr_legitimatie, disciplina, an_studiu, MAX(nota) AS maxim
FROM note
WHERE an_studiu = 1 AND nr_legitimatie = new.nr_legitimatie
GROUP BY nr_legitimatie, disciplina
) as medie1,
(
SELECT nr_legitimatie, disciplina, an_studiu, MAX(nota) AS maxim
FROM note
WHERE an_studiu = 2 AND nr_legitimatie = new.nr_legitimatie
GROUP BY nr_legitimatie, disciplina
) as medie2,
(
SELECT nr_legitimatie, disciplina, an_studiu, MAX(nota) AS maxim
FROM note
WHERE an_studiu = 3 AND nr_legitimatie = new.nr_legitimatie
GROUP BY nr_legitimatie, disciplina
) as medie3
),
medii_union AS (
SELECT medii_pe_coloane.medie_an_1 as medie from medii_pe_coloane
UNION ALL
SELECT medii_pe_coloane.medie_an_2 as medie from medii_pe_coloane
UNION ALL
SELECT medii_pe_coloane.medie_an_3 as medie from medii_pe_coloane
),
medie_generala AS (
SELECT AVG(medii_union.medie) as medie FROM medii_union
)
SELECT medii_pe_coloane.*, medie_generala.medie from medii_pe_coloane, medie_generala
)
SELECT nr_legitimatie, medie, medie_an_1, medie_an_2, medie_an_3
FROM date
我無法理解可能發生的事情。它沒有被覆寫。也許它超出了它的范圍?我怎么可能在 WHERE 子句中使用它?
錯誤是:
#1054 - Unknown column 'nr_legitimatie' in 'NEW'
為了測驗它,我在note表中插入了一個新行,其中 100% 包含“nr_legitimatie”列。
瑪麗亞資料庫 10.4
uj5u.com熱心網友回復:
我在我的手機上所以還沒有測驗過這個,但也許你不能在同一個觸發器中參考 NEW 三次?
如果是這樣,我會重寫您的查詢,無論如何它看起來都有邏輯錯誤。
這是我建議的查詢...
INSERT INTO
medii (
MEDII.nr_legitimatie, MEDII.medie_generala, medii.medie_an1, medii.medie_an2, medii.medie_an3
)
WITH
max_an_studiu AS
(
SELECT nr_legitimatie, disciplina, an_studiu, MAX(nota) AS maxim
FROM note
WHERE an_studiu IN (1, 2, 3)
AND nr_legitimatie = (SELECT nr_legitimatie FROM new)
GROUP BY nr_legitimatie, disciplina, an_studiu
),
medie AS
(
SELECT
nr_legitimatie,
an_studiu,
AVG(maxim) AS medie
FROM
max_an_studiu
GROUP BY
nr_legitimatie,
an_studiu
)
SELECT
nr_legitimatie,
AVG(medie) AS medie,
MAX(CASE WHEN an_studiu=1 THEN medie END) AS medie_an_1,
MAX(CASE WHEN an_studiu=2 THEN medie END) AS medie_an_2,
MAX(CASE WHEN an_studiu=3 THEN medie END) AS medie_an_3
FROM
medie
GROUP BY
nr_legitimatie
uj5u.com熱心網友回復:
在您的公用表運算式 (CTE) 中,您沒有在子句中提及偽表NEWFROM,因此它不在范圍內。
您可以使用內部連接重寫它們,例如
SELECT note.nr_legitimatie, note.disciplina, note.an_studiu, MAX(note.nota) AS maxim
FROM note INNER JOIN new on note.nr_legitimatie = new.nr_legitimatie
WHERE note.an_studiu = 1
GROUP BY note.nr_legitimatie, note.disciplina
不要忘記您必須限定所有列名,因為它們將在note和new之間重復。
如果您使用子查詢(您作為 CTE 放置的內容作為FROMfinal 子句的一部分出現SELECT),那么偽表NEW確實在范圍內 - 這是一個相關的子查詢。
uj5u.com熱心網友回復:
這是一個帶有誤導性錯誤訊息的MariaDB 錯誤(尤其參見此評論,其中包含一個與您的問題接近的可重現示例)。
當您重用使用new.
在你的情況,你正在使用medii_pe_coloane(使用new)的3倍 medii_union,一次在最終選擇的date。這會觸發錯誤。
不過,您可以new隨心所欲地使用它自己(在任意數量的CTE 中)。因此,解決方法是多次重新定義 CTE,例如
WITH medii_pe_coloane AS ( <query using "new"> ),
medii_pe_coloane1 AS ( <same query using "new"> ),
medii_pe_coloane2 AS ( <same query using "new"> ),
medii_pe_coloane3 AS ( <same query using "new"> ),
...
medii_union AS (
select medii_pe_coloane1.medie_an_1 ... from medii_pe_coloane1
union all select medii_pe_coloane2.medie_an_2 ... from medii_pe_coloane2
union all select medii_pe_coloane3.medie_an_3 ... from medii_pe_coloane3)
...
SELECT ... from medii_pe_coloane, medie_generala
使您的代碼有點重復,但應該作為一般的解決方法。或者,您可以改寫和/或以其他方式簡化您的查詢(參見例如MatBailies 答案)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/357311.html
標籤:mysql sql phpmyadmin mariadb-10.4
上一篇:如何在Join中包含Null值
