对 table "mdl_user" 的 FROM 子句条目的引用无效
Invalid reference to FROM-clause entry for table "mdl_user"
我正在尝试为 Moodle v2.7 数据库(使用 PostgreSQL 9.3)构建所有用户及其特定课程分数的报告。我收到以下错误并查看了问题和其他示例产生相同的错误,但其中 none 为我的特定问题提供了答案。不确定我在这里忽略了什么。
ERROR: Invalid reference to FROM-clause entry for table "mdl_user"
SELECT
mdl_user.lastname as LastName,
mdl_user.firstname as FirstName,
Grr.finalgrade as Grade,
REPLACE(Grr.itemname,'COURSE: ','') as Course,
TO_CHAR(TO_TIMESTAMP(Grr.timemodified), 'MM/DD/YYYY') as Completed
FROM
public.mdl_user LEFT JOIN (
SELECT
mdl_grade_grades.finalgrade,
mdl_grade_items.itemname,
mdl_grade_grades.userid,
mdl_grade_grades.timemodified
FROM
public.mdl_grade_items LEFT JOIN public.mdl_grade_grades
ON public.mdl_grade_items.id = public.mdl_grade_grades.itemid
WHERE
mdl_grade_grades.userid = mdl_user.id AND
mdl_grade_items.itemname LIKE 'COURSE: Lock Out Tag Out: ECP'
) AS Grr ON Grr.userid = public.mdl_user.id
ORDER BY
mdl_user.lastname,
mdl_user.firstname
在子选择 Grr
中,删除 mdl_grade_grades.userid = mdl_user.id
。
这是导致错误的原因,它已经加入了 AS Grr ON Grr.user.id=public.mdl_user.id
行。
@avk 是对的。但还有更多。适当简化的查询:
SELECT u.lastname
, u.firstname
, g.finalgrade AS grade
, right(i.itemname, -8) AS course
, to_char(to_timestamp(g.timemodified), 'MM/DD/YYYY') AS completed
FROM public.mdl_user u
LEFT JOIN
(public.mdl_grade_items i
JOIN public.mdl_grade_grades g ON g.itemid = i.id
AND i.itemname = 'COURSE: Lock Out Tag Out: ECP'
) ON g.userid = u.id
ORDER BY 1,2;
在左操作数应该是直接匹配而不是模式的情况下使用 LIKE
是一个微妙的错误。这可能会导致令人困惑的副作用,比如不由自主地解释特殊字符或这个(今天的例子):
- unaccent() preventing index usage in Postgres
您有一个 LEFT JOIN
与右侧的谓词组合 table,这会将其强制转换为普通的 [INNER] JOIN
。我将谓词移至 join 子句以修复该问题。相关:
- Left outer join acting like inner join
完全替换子查询。您可以在 FROM
子句中使用括号来实现您想要的。
不加引号的混合大小写标识符毫无意义。
- Are PostgreSQL column names case-sensitive?
我正在尝试为 Moodle v2.7 数据库(使用 PostgreSQL 9.3)构建所有用户及其特定课程分数的报告。我收到以下错误并查看了问题和其他示例产生相同的错误,但其中 none 为我的特定问题提供了答案。不确定我在这里忽略了什么。
ERROR: Invalid reference to FROM-clause entry for table "mdl_user"
SELECT
mdl_user.lastname as LastName,
mdl_user.firstname as FirstName,
Grr.finalgrade as Grade,
REPLACE(Grr.itemname,'COURSE: ','') as Course,
TO_CHAR(TO_TIMESTAMP(Grr.timemodified), 'MM/DD/YYYY') as Completed
FROM
public.mdl_user LEFT JOIN (
SELECT
mdl_grade_grades.finalgrade,
mdl_grade_items.itemname,
mdl_grade_grades.userid,
mdl_grade_grades.timemodified
FROM
public.mdl_grade_items LEFT JOIN public.mdl_grade_grades
ON public.mdl_grade_items.id = public.mdl_grade_grades.itemid
WHERE
mdl_grade_grades.userid = mdl_user.id AND
mdl_grade_items.itemname LIKE 'COURSE: Lock Out Tag Out: ECP'
) AS Grr ON Grr.userid = public.mdl_user.id
ORDER BY
mdl_user.lastname,
mdl_user.firstname
在子选择 Grr
中,删除 mdl_grade_grades.userid = mdl_user.id
。
这是导致错误的原因,它已经加入了 AS Grr ON Grr.user.id=public.mdl_user.id
行。
@avk 是对的。但还有更多。适当简化的查询:
SELECT u.lastname
, u.firstname
, g.finalgrade AS grade
, right(i.itemname, -8) AS course
, to_char(to_timestamp(g.timemodified), 'MM/DD/YYYY') AS completed
FROM public.mdl_user u
LEFT JOIN
(public.mdl_grade_items i
JOIN public.mdl_grade_grades g ON g.itemid = i.id
AND i.itemname = 'COURSE: Lock Out Tag Out: ECP'
) ON g.userid = u.id
ORDER BY 1,2;
在左操作数应该是直接匹配而不是模式的情况下使用
LIKE
是一个微妙的错误。这可能会导致令人困惑的副作用,比如不由自主地解释特殊字符或这个(今天的例子):- unaccent() preventing index usage in Postgres
您有一个
LEFT JOIN
与右侧的谓词组合 table,这会将其强制转换为普通的[INNER] JOIN
。我将谓词移至 join 子句以修复该问题。相关:- Left outer join acting like inner join
完全替换子查询。您可以在
FROM
子句中使用括号来实现您想要的。不加引号的混合大小写标识符毫无意义。
- Are PostgreSQL column names case-sensitive?