首页 > 解决方案 > 多部分标识符无法在 SQL Server 中绑定并混淆

问题描述

我有这个 SQL 查询:

SELECT 
    stu.sno, sname, cname
FROM
    sc scc,
    (SELECT AVG(sc.grade) AS avg_grade 
     FROM sc 
     GROUP BY sc.cno) AS avg_grades
INNER JOIN 
    course c ON c.cno = scc.cno
INNER JOIN 
    s stu ON stu.sno = scc.sno;

scc.cno并且出现无法绑定多部分标识符的错误。我很困惑 - 有人可以帮助我吗?

标签: sqlsql-serversubqueryinner-joinwindow-functions

解决方案


不要混合隐式和显式连接!事实上,不要使用隐式连接:这是古老的语法,不应该出现在新代码中。

子句中的逗号FROM应该(可能)是CROSS JOIN

SELECT stu.sno, sname, cname
FROM sc scc
CROSS JOIN (SELECT AVG(sc.grade) AS avg_grade FROM sc GROUP BY sc.cno) AS avg_grades
INNER JOIN course c on c.cno = scc.cno
INNER JOIN s stu on stu.sno = scc.sno;

请注意,要使此子查询有用,您可能需要selectavg_grade. 我还建议在每列前面加上它所属的表,以消除任何可能的歧义。

最后:您(可能)可以使用窗口函数而不是子查询:

SELECT stu.sno, sname, cname, scc.
FROM (SELECT *, AVG(grade) OVER() avg_grade FROM sc) scc
INNER JOIN course c on c.cno = scc.cno
INNER JOIN s stu on stu.sno = scc.sno;

推荐阅读