对 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?