首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >漏掉右括号- ORA-00907

漏掉右括号- ORA-00907
EN

Stack Overflow用户
提问于 2015-09-14 12:23:49
回答 2查看 107关注 0票数 1
代码语言:javascript
复制
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'

正如鲍勃正确地指出的那样,这里面有一个'_‘。但是现在它说使用不能有限定符。

学生:

代码语言:javascript
复制
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
 )

采取:

代码语言:javascript
复制
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
)

指导员:

代码语言:javascript
复制
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
)

教:

代码语言:javascript
复制
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
);

我已按要求粘贴了结构。我希望这能帮上忙!我也尝试过编辑引号,但仍然没有用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-14 12:34:07

问题不是括号太少,而是括号太多了。

我在这里猜得有点像,因为我不知道您的表到底是什么样子,但是您的SELECT语句应该是:

代码语言:javascript
复制
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这样的文字处理器添加的那样。字符串常量需要被单引号(')包围--使用其他任何内容都会导致错误。

祝你好运。

票数 0
EN

Stack Overflow用户

发布于 2016-10-30 23:30:38

正如Bob所指出的,第三个using子句有应该有下划线的空格;然后更改它们(正如您编辑的问题所指出的那样):

代码语言:javascript
复制
ORA-25154: column part of USING clause cannot have qualifier

因为select列表有student.ID。当您使用using子句时,不能直接引用联接表中的列,因此您需要:

代码语言:javascript
复制
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';

..。但现在

代码语言:javascript
复制
ORA-00918: column ambiguously defined

..。因为学生和讲师都有ID列,这大概就是为什么select列表首先是前缀的原因。您可以使用内联视图从select列表范围中丢失讲师ID:

代码语言:javascript
复制
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语法和简化联接,例如:

代码语言:javascript
复制
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';

Also see an earlier related answer for more

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32564737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档