ERROR: Unresolved reference to table/correlation name (SAS, PROC SQL)

ERROR: Unresolved reference to table/correlation name (SAS, PROC SQL)

当我没有使用完整的 table 名称时,我收到错误消息“错误:未解析对每个列名称的 table/correlation 名称的引用。现在我正在使用完整的 table 名称并得到相同的错误。不知道还能尝试什么 - 我是 SQL 的新手,仍然不太了解它是如何工作的。

这是日志的副本:

171        PROC SQL;
172        CREATE table Spillover AS select
172      ! Y16_CALC_STUD.Student_ID,Y16_LINK_GM.score,Y16_CALC_STUD.StudSGP,Y16_CALC_STUD.g    rade_subject_ID,Y16_LINK_GM.employeeID,Y1
172      !     6_GROW_TEACHER.HEDI,Y16_GROW_TEACHER.HEDI_points,Y16_GROW_TEACHER.avg_prescore
173        from (select Y16_CALC_STUD.Student_ID, Y16_CALC_STUD.StudSGP, Y16_CALC_STUD.CalcID, Y16_LINK_GM.school_DBN,
173      ! Y16_LINK_GM.Score, Y16_LINK_GM.employeeID, Y16_LINK_GM.grade_subject_ID
174        from  Y16_CALC_Stud as a left join Y16_LINK_GM as link
175        on link.Student_ID = link.Student_ID)
176        as c left join Y16_GROW_Teacher as d on
177        Y16_CALC_Stud.StudCalcID = Y16_GROW_Teacher.calcID and Y16_LINK_GM.employeeID=Y16_GROW_Teacher.employeeID and
177      ! Y16_CALC_Stud.grade_subject_ID=Y16_GROW_Teacher.GRADE_SUBJECT;
ERROR: Unresolved reference to table/correlation name Y16_CALC_Stud.
ERROR: Unresolved reference to table/correlation name Y16_LINK_GM.
ERROR: Unresolved reference to table/correlation name Y16_CALC_Stud.
ERROR: Unresolved reference to table/correlation name Y16_CALC_STUD.
ERROR: Unresolved reference to table/correlation name Y16_LINK_GM.
ERROR: Unresolved reference to table/correlation name Y16_CALC_STUD.
ERROR: Unresolved reference to table/correlation name Y16_CALC_STUD.
ERROR: Unresolved reference to table/correlation name Y16_LINK_GM.
ERROR: Expression using equals (=) has components that are of different data types.
ERROR: Expression using equals (=) has components that are of different data types.
NOTE: PROC SQL set option NOEXEC and will continue to check the syntax of statements.

我在 Base SAS 和 Enterprise Guide 中遇到同样的错误。

在 SAS 的 proc sql 中,您在 fromjoin 语句中引用了要加入的数据集,而不是在 select 语句中。 SAS 将 Y16_CALC_STUD.Student_ID 解释为您引用名为 Y16_CALC_STUD 的库并使用该库中名为 Student_ID 的数据集,这不是我认为您在这里尝试做的。所以我只是将所有这些替换为 abc,并将您的三个数据集称为 abc 在代码的 from/join 部分。

PROC SQL;
    CREATE table Spillover AS select 
        a.Student_ID, b.score, a.StudSGP, a.grade_subject_ID, b.employeeID,
        c.HEDI, c.HEDI_points, c.avg_prescore

        from Y16_CALC_STUD as a 
        left join Y16_LINK_GM as b
        on a.Student_ID = b.Student_ID
        left join Y16_GROW_Teacher as c
        on a.StudCalcID = c.calcID and a.employeeID = c.employeeID and a.grade_subject_ID = c.GRADE_SUBJECT;
quit;

您的子查询缺少右括号,您正在定义结果以使用 abc 等别名。但是在您的列列表中,您没有使用您定义的别名。

可能最简单的方法是只在定义它们的地方修复别名,而不是更新列列表中的每个引用。

(select Y16_CALC_STUD.Student_ID
      , Y16_CALC_STUD.StudSGP
      , Y16_CALC_STUD.CalcID
 from Y16_CALC_Stud
) as Y16_CALC_Stud

已通过删除所有别名并使用以下内容修复:

PROC SQL;
CREATE table Spillover AS select Y16_CALC_STUD.Student_ID,Y16_LINK_GM.score,Y16_CALC_STUD.StudSGP,Y16_CALC_STUD.g    rade_subject_ID,Y16_LINK_GM.employeeID,Y16_GROW_TEACHER.HEDI,Y16_GROW_TEACHER.HEDI_points,Y16_GROW_TEACHER.avg_prescore
from (select Y16_CALC_STUD.Student_ID, Y16_CALC_STUD.StudSGP, Y16_CALC_STUD.CalcID, Y16_LINK_GM.school_DBN, Y16_LINK_GM.Score, Y16_LINK_GM.employeeID, Y16_LINK_GM.grade_subject_ID
from  Y16_CALC_Stud left join Y16_LINK_GM
on Y16_LINK_GM.Student_ID = Y16_LINK_GM.Student_ID) 
left join Y16_GROW_Teacher on
Y16_CALC_Stud.CalcID = Y16_GROW_Teacher.calcID and Y16_LINK_GM.employeeID=Y16_GROW_Teacher.employeeID and Y16_LINK_GM.grade_subject_ID=Y16_GROW_Teacher.GRADE_SUBJECT;

首先 - 您的代码创建了一个子查询,您正在使用别名引用子查询 - "C"。我已经更新了查询,以便您的子查询 C 包含主查询中引用的 "Y16_CALC_Stud.StudCalcID" 。

除此之外,您的主要查询指的是具有主要数据集名称的变量,即Y16_CALC_STUD.CalcId 由于您提供了别名,因此必须将其称为 c.CalcID。

最后,您的错误 "Expression using equals (=) has components that are of different data types." 是因为您使用的连接条件是不同的数据类型。例如 "c.grade_subject_ID = Y16_GROW_Teacher.GRADE_SUBJECT" c.grade_subject_id 和 Grade_subject 可能有不同的数据类型。一个可能是数字,另一个可能是字符。您必须在加入前输入 cast。

    PROC SQL;
    CREATE table Spillover AS 
select c.Student_ID,
    c.score,
    c.StudSGP,
    c.grade_subject_ID,
    c.employeeID,
    d.HEDI,
    d.HEDI_points,
    d.avg_prescore

    from 
    (select 
        Y16_CALC_STUD.Student_ID, 
        Y16_CALC_STUD.StudSGP, 
        Y16_CALC_STUD.CalcID, 
        Y16_LINK_GM.school_DBN,
        Y16_LINK_GM.Score, 
        Y16_LINK_GM.employeeID, 
        Y16_LINK_GM.grade_subject_ID,
        Y16_CALC_Stud.StudCalcID
    from  Y16_CALC_Stud as a 
left join Y16_LINK_GM as link on a.Student_ID = link.Student_ID) as C
    left join Y16_GROW_Teacher as d on c.StudCalcID = Y16_GROW_Teacher.calcID 
and c.employeeID = Y16_GROW_Teacher.employeeID 
and c.grade_subject_ID = Y16_GROW_Teacher.GRADE_SUBJECT;

上面的查询应该可以解决除数据类型问题之外的所有错误。