我需要创建一个预联接三个表的视图,包括来自student和course表的所有记录(如下所示)

uoifb46i  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(176)

这个问题在这里已经有了答案

错误报告-ora-25155:自然联接中使用的列不能有限定符25155。00000-“自然联接中使用的列不能有限定符”(1个答案)
9个月前关门了。
--我正在尝试为下面所示的表创建一个视图,但是我的尝试没有成功。我正在使用oracle sql developer!!错在哪里

CREATE VIEW student_view AS 
SELECT Student.*, Course.*, Grade.* FROM (Student NATURAL LEFT OUTER JOIN Grade NATURAL LEFT OUTER JOIN Course)
UNION ALL
SELECT Student.*, Course.*, Grade.* FROM (Course NATURAL LEFT OUTER JOIN Grade NATURAL LEFT OUTER JOIN Student) WHERE Student.StudentID is NULL
;

CREATE TABLE Student(
   StudentID INT PRIMARY KEY NOT NULL,
   Name CHAR(50),
   Address CHAR(50),
   GradYear INT
);

-- create table Grade
CREATE TABLE Grade(
    CName CHAR(50) NOT NULL,
    StudentID INT NOT NULL,
    CGrade CHAR(2),
    PRIMARY KEY(CName, StudentID)
);

-- create table Course
CREATE TABLE Course(
   CName CHAR(50) PRIMARY KEY NOT NULL,
   Department CHAR(50),
   Credits INT
);
7dl7o3gd

7dl7o3gd1#

应该先创建基础表,然后再将它们组合到视图中。

mwngjboj

mwngjboj2#

请按照下面的顺序,

CREATE TABLE Student(
   StudentID INT PRIMARY KEY NOT NULL,
   Name CHAR(50),
   Address CHAR(50),
   GradYear INT
);

-- create table Grade
CREATE TABLE Grade(
    CName CHAR(50) NOT NULL,
    StudentID INT NOT NULL,
    CGrade CHAR(2),
    PRIMARY KEY(CName, StudentID)
);

-- create table Course
CREATE TABLE Course(
   CName CHAR(50) PRIMARY KEY NOT NULL,
   Department CHAR(50),
   Credits INT
);

CREATE VIEW student_view AS 
SELECT Student.StudentID , Student.Name, Student.Address, Student.GradYear, 
Course.CName, Course.CGrade, Grade.Department, Grade.Credits FROM Student 
LEFT OUTER JOIN Grade 
on (Student.StudentID = Grade.StudentID)
LEFT OUTER JOIN Course
on (Grade.CName = Course.CName);
v2g6jxz6

v2g6jxz63#

修正版本:
按正确顺序定义的表
改变 CHARVARCHAR2 添加了外键约束(继承数据类型)
删除了不允许的表别名 NATURAL JOIN 语法
从视图中删除多余的支架。
table:

create table student
( studentid   integer primary key not null
, name        varchar2(50) not null
, address     varchar2(50)
, gradyear    integer );

create table course
( cname       varchar2(50) primary key not null
, department  varchar2(50)
, credits     integer );

create table grade
( cname       references course not null
, studentid   references student not null
, cgrade      varchar2(2) not null
, primary key(cname, studentid) );

查看:

create or replace view student_view as 
select studentid, name, address, gradyear
     , cname, department, credits
     , cgrade
from   student
       natural left outer join grade
       natural left outer join course
union all
select studentid, name, address, gradyear
     , cname, department, credits
     , cgrade
from   course
       natural left outer join grade
       natural left outer join student
where  studentid is null;

再补充一句, NATURAL JOIN 在真正的代码中从来都不是个好主意。

相关问题