【问题标题】:missing right parantjesis, missing expression, error on subquery缺少右括号,缺少表达式,子查询错误
【发布时间】:2016-04-14 13:09:10
【问题描述】:

我的数据库是一个带有音乐 CD 和录像带的租赁中心。

    create table cds (
    id_cd varchar2(5) pk_cduri primary key,
    artists varchar2(100) not null,
    genre varchar2(20) not null,
    release date not null,
    constraint pk_cds primary key(id_cd)
    );


    create table replenishment(
    id_ap varchar2(5) constraint pk_aprovizionari primary key,
    id_cd varchar2(5),
    quantity_cd number(5,2) default 0,
    price_cd number(5,2) default 0,
    id_cv varchar2(5), 
    cquantity_cv number(5,2) default 0, 
    price_cv number(5,2) default 0,
    data_rep date default sysdate, 
    total_cost as (quantity_cd* price_cd+ quantity_cv* price_cv),
    constraint fk_ap_cd foreign key (id_cd) references  cds,
    constraint fk_ap_cv foreign key (id_cv) references  videotapes
    );

当 id_cust='c1' 的客户借用 id_cd='cd1' 的 cd,然后 bor_cd=1 并且当客户 'c1' 返回 'cd1' 时,我必须在 ret_cd 中插入值 1。

    create table bor_ret (
    id int constraint pk_bor_ret primary key,
    id_cust varchar2(5) not null, 
    id_cd varchar2(5),
    bor_cd int default 0,
    ret_cd int default 0,
    id_cv varchar2(5),
    bor_cv int default 0,
    ret_cv int default 0,
    data date default sysdate,
    constraint fk_cd_imp foreign key (id_cd) references cds(id_cd),
    constraint fk_cv_imp foreign key (id_cv) references videotapes(id_cv),
    constraint fk_ab_imp  foreign key (id_cust) references customers,
    constraint ck_imp_cd_value_flag check (bor_cd in (1,0)), 
    constraint ck_imp_cv_value_flag check (bor_cv in (1,0)),
    constraint ck_ret_cd_value_flag check (ret_cd in (1,0)),
    constraint ck_ret_cv_value_flag check (ret_cv in (1,0))
    );

我必须创建一个触发器(我不知道如何定义它,但如果有人知道,我会提出一个新问题来接受它的答案),它每次都设置 bor_cd=0在 ret_cd 中插入值 1 后:

update bor_ret set bor_cd=0 where id_cust=(select id_cust from bor_ret where ret_cd=1);

然后我必须向 CDS 添加一个计算列,用于计算最后插入的 cd 的数量: id_cd=cd1 的 CDS 的“cd1”数量与 id_cd=cd1 的 BOR_RET 提供的数量相等。

所以,我想运行这个命令:

alter table cds add quantity as(
 select quantity_cd from replenishment b inner join cds a on a.id_cd=b.id_cd where b.id_cd=
 (select id_cd from cds where rownum=1 order by id_cd desc) -
 (select count(id_cd) from bor_ret d inner join cds c on c.id_cd=d.id_cd where d.id_cd=
 (select id_cd from cds where rownum=1 order by id_cd desc) and d.bor_cd=1));

我收到此错误:“缺少表达式”。 如果我只运行查询:select quantity_cd... 我得到错误: “第 2 行出现错误:ORA-00907:缺少右括号”

或者,更好的是,我如何将此列添加为差异:

    select quantity_cd from replenishment where id_cd=(select max(id_cd) from cds) as A

    select count(id_cd) from bor_ret where id_cd=(select max(id_cd) from cds) and bor_cd=1 as B

quantity = A-B;

这个线程是为了解决计算列的问题,但是如果有人能解释我如何创建触发器,我会为它打开一个新线程。

提前谢谢你们。

【问题讨论】:

  • 你同时问了太多问题,而且不清楚=/。我认为您的主要问题实际上只是顺便提出的,但并没有以问题的形式提出,这很有趣。
  • 您的第二个子查询没有右括号。你现在看到了吗?
  • @PM 77-1 所有的括号都关闭了。看起来更好。
  • 计算列不能基于SELECT 语句,您只能引用同一行中的列,例如as (quantity_cd * price_cd)。另外:您的update 语句很可能也会失败,因为您不能将= 与返回多行的子选择一起使用。

标签: sql oracle oracle11g triggers subquery


【解决方案1】:

请注意最后一行中的第二个右括号。

select quantity_cd 
from replenishment b 
inner join cds a on a.id_cd=b.id_cd 
where b.id_cd=
           (select id_cd from cds where rownum=1 order by id_cd desc) - 
           (select count(id_cd) from bor_ret d inner join cds c on c.id_cd=d.id_cd where d.id_cd= (select id_cd from cds where rownum=1 order by id_cd desc)) /* <------ ===*/
    and d.bor_cd=1)

【讨论】:

    猜你喜欢
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多