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
)教:
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
);我已按要求粘贴了结构。我希望这能帮上忙!我也尝试过编辑引号,但仍然没有用。
发布于 2015-09-14 12:34:07
问题不是括号太少,而是括号太多了。
我在这里猜得有点像,因为我不知道您的表到底是什么样子,但是您的SELECT语句应该是:
select distinct student.ID
from student
join takes
using(ID)
join instructor
using(ID)
join teaches
using(course id, sec id, semester, year)
where instructor.name = 'Einstein'此外,您还需要小心正在使用的编辑器。在你的问题中,围绕‘爱因斯坦’的单引号不是真正的单引号--它们似乎是Unicode撇号,就像像Microsoft Word这样的文字处理器添加的那样。字符串常量需要被单引号(')包围--使用其他任何内容都会导致错误。
祝你好运。
发布于 2016-10-30 23:30:38
正如Bob所指出的,第三个using子句有应该有下划线的空格;然后更改它们(正如您编辑的问题所指出的那样):
ORA-25154: column part of USING clause cannot have qualifier因为select列表有student.ID。当您使用using子句时,不能直接引用联接表中的列,因此您需要:
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';..。但现在
ORA-00918: column ambiguously defined..。因为学生和讲师都有ID列,这大概就是为什么select列表首先是前缀的原因。您可以使用内联视图从select列表范围中丢失讲师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';但是,您最好在这里避免使用using,而使用on语法和简化联接,例如:
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';https://stackoverflow.com/questions/32564737
复制相似问题