【问题标题】:ERROR: Unresolved reference to table/correlation name (SAS, PROC SQL)错误:未解决对表/相关名称的引用(SAS、PROC SQL)
【发布时间】:2016-09-26 16:13:33
【问题描述】:

我收到错误消息“错误:当我没有使用完整的表名时,未解决对每个列名的表/相关名的引用。现在我正在使用完整的表名并遇到相同的错误。不确定是什么其他尝试 - 我对 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 中遇到同样的错误。

【问题讨论】:

    标签: sql sas proc-sql enterprise-guide


    【解决方案1】:

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

    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;
    

    【讨论】:

      【解决方案2】:

      您的子查询缺少右括号,并且您将结果定义为使用a、b、c 等别名。但是在您的列列表中,您没有使用您定义的别名。

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

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

      【讨论】:

        【解决方案3】:

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

        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;
        

        【讨论】:

          【解决方案4】:

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

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

          最后,您的错误说“使用等号 (=) 的表达式具有不同数据类型的组件。”是因为您使用的连接条件是不同的数据类型。例如“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;
          

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

          【讨论】:

            猜你喜欢
            • 2023-03-28
            • 2019-09-24
            • 2017-07-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多