1

我是编程新手,我正在用家里的教科书自学 ORACLE sql。我想知道是否有人可以解释为什么这个脚本不起作用。我已经能够以其他方式做到这一点并得到答案,但我只是想了解为什么我无法为内联视图起别名的基本原理。谢谢。

SELECT * FROM  
(  
(SELECT * FROM SECTION WHERE INSTRUCTOR='HERMANO') s  
JOIN Grade_report g  
ON s.section_ID=g.section_id
) v
JOIN Student Stu   
ON stu.stno=v.student_number

返回:“SQL 命令未正确结束”

表 Grade_report 有列:section_number、section_ID、Grades;
学生表有列:stno(学号);
表Section有列:section_ID、Instructor;

4

1 回答 1

3

它不起作用,因为您尝试提供别名v的部分不是有效的查询:

(
  (SELECT *
  FROM SECTION
  WHERE INSTRUCTOR='HERMANO') s

  JOIN Grade_report g
    ON s.section_ID=g.section_id
) v

您可以通过在该片段中添加额外的选择使其有效:

SELECT *
FROM
( SELECT * /* This is new */
  FROM
    (SELECT *
    FROM SECTION
    WHERE INSTRUCTOR='HERMANO') s
  JOIN Grade_report g
    ON s.section_ID=g.section_id
) v
JOIN Student Stu
  ON stu.stno=v.student_number

或者您可以完全删除该别名并在同一级别上有两个连接:

SELECT *
FROM
  (SELECT *
  FROM SECTION
  WHERE INSTRUCTOR='HERMANO') s
  JOIN Grade_report g
    ON s.section_ID=g.section_id
  JOIN Student Stu
    ON stu.stno=v.student_number

这与以下内容基本相同:

SELECT *
FROM SECTION s
JOIN Grade_report g
  ON s.section_ID=g.section_id
JOIN Student Stu
  ON stu.stno=v.student_number
WHERE s.INSTRUCTOR='HERMANO'
于 2015-06-04T21:03:36.070 回答