Oracle 缺少右括号-ORA-00907
正如鲍勃正确指出的那样,这里面有一个“u”。但现在它说使用不能有限定符 学生:Oracle 缺少右括号-ORA-00907,oracle,Oracle,正如鲍勃正确指出的那样,这里面有一个“u”。但现在它说使用不能有限定符 学生: select distinct student.ID from (student join takes using(ID)) join (instructor join teaches using(ID)) using(course_id, sec_id, semester, year) where instructor.name = 'Einstein' 采取: create table student (ID
select distinct student.ID
from (student join takes using(ID))
join (instructor join teaches using(ID))
using(course_id, sec_id, semester, year)
where instructor.name = 'Einstein'
采取:
create table student
(ID varchar(5),
name varchar(20) not null,
dept_name varchar(20),
tot_cred numeric(3,0) check (tot_cred >= 0),
primary key (ID),
foreign key (dept_name) references department
on delete set null
)
讲师:
create table takes
(ID varchar(5),
course_id varchar(8),
sec_id varchar(8),
semester varchar(6),
year numeric(4,0),
grade varchar(2),
primary key (ID, course_id, sec_id, semester, year),
foreign key (course_id,sec_id, semester, year) references section
on delete cascade,
foreign key (ID) references student
on delete cascade
)
教导:
create table instructor
(ID varchar(5),
name varchar(20) not null,
dept_name varchar(20),
salary numeric(8,2) check (salary > 29000),
primary key (ID),
foreign key (dept_name) references department
on delete set null
)
我已按要求粘贴了结构。我希望这有帮助!
我也尝试过编辑引号,但仍然没有用。问题不是括号太少,而是括号太多 我在这里猜测了一下,因为我不知道您的表到底是什么样子,但您的SELECT语句应该是:
create table teaches
(ID varchar(5),
course_id varchar(8),
sec_id varchar(8),
semester varchar(6),
year numeric(4,0),
primary key (ID, course_id, sec_id, semester, year),
foreign key (course_id,sec_id, semester, year) references section
on delete cascade,
foreign key (ID) references instructor
on delete cascade
);
此外,您需要小心使用的编辑器。在你的问题中,围绕“爱因斯坦”的单引号并不是真正的单引号——它们似乎是Unicode撇号,可以由文字处理器(如Microsoft word)添加。字符串常量需要用单引号字符(')包围-使用任何其他字符都会导致错误
祝你好运。正如Bob Jarvis指出的,第三个
using
子句中应该有下划线的空格;更改这些选项将获得(正如您编辑问题时所说):
因为选择列表有student.ID
。当您使用using
子句时,中的列不能在联接表中直接引用,因此您需要执行以下操作:
ORA-25154: column part of USING clause cannot have qualifier
。。。但现在这一切都会过去
select distinct ID
from (student join takes using(ID))
join (instructor join teaches using(ID))
using(course_id, sec_id, semester, year)
where instructor.name = 'Einstein';
。。。因为学生和讲师都有ID列,这大概就是为什么选择列表首先要加前缀的原因。您可以使用内联视图从选择列表范围中丢失讲师ID:
ORA-00918: column ambiguously defined
但实际上,您最好不要在此处使用,而是使用上的语法和简化联接,例如:
select distinct ID
from (student join takes using(ID))
join (select course_id, sec_id, semester, year, name
from instructor join teaches using(ID)) instructor
using(course_id, sec_id, semester, year)
where instructor.name = 'Einstein';
.请编辑问题,并包括查询中提到的所有表格的结构(学生、课程、讲师和教师)。不要将表格描述放在注释中-将其编辑到问题中。谢谢。另外-在TEACHES表的联接中,涉及的字段的名称是什么?我注意到USING
子句中应该有空格,例如course
和id
之间-这两个字段是分开的,还是应该是course\u id
,或者什么?有什么线索吗?还没有解决!
select distinct ID
from (student join takes using(ID))
join (select course_id, sec_id, semester, year, name
from instructor join teaches using(ID)) instructor
using(course_id, sec_id, semester, year)
where instructor.name = 'Einstein';
select distinct stu.id
from instructor ins
join teaches tea on tea.id = ins.id
join takes tak on tak.course_id = tea.course_id
and tak.sec_id = tea.sec_id
and tak.semester = tea.semester
and tak.year = tea.year
join student stu on stu.id = tak.id
where ins.name = 'Einstein';