【问题标题】:missing right parenthesis 00907. 00000 - "missing right parenthesis"缺少右括号 00907. 00000 - “缺少右括号”
【发布时间】:2019-11-12 04:58:13
【问题描述】:

考虑以下架构:

Suppliers(sid: integer, sname: string, address: string) 
Parts(pid: integer, pname: string, color: string) 
Catalog(sid: integer, pid: integer, cost: real) 

目录关系列出了供应商对零件收取的价格。

我有两个问题:

  1. 对于每个只提供绿色零件的供应商,打印其名称 供应商及其供应的零件总数。
  2. 对于每个供应绿色部分和红色部分的供应商,打印 她提供的最昂贵部件的名称和价格。

这是我迄今为止尝试过的:

select  s.sname, count(*)
from    suppliers s, parts p, catalog c
where   p.pid = c.pid and c.sid = s.sid
group by s.sname, s.sid
having every (p.color = 'green')

select s.sname, max(c.cost)
from    suppliers s, parts p, catalog c
where   p.pid = c.pid and c.sid = s.sid
group by s.sname, s.sid
having some (p.color = 'green') and some (p.color = 'red')

当我执行上述两个查询时,查询输出显示缺少右括号,需要帮助,谢谢。

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    Oracle 中没有 everysome(至少在 11g 中没有),所以您的 having 子句都不正确。

    【讨论】:

    • 当我删除每一个或部分并尝试使用新文本时它不起作用,请您帮我写下整个查询谢谢。
    • 这取决于你想做什么。如果您可以发布一些示例数据和所需的结果,我们将能够建议如何做到这一点。
    • 考虑以下模式:Suppliers(sid: integer, sname: string, address: string) Parts(pid: integer, pname: string, color: string) Catalog(sid: integer, pid: integer , cost: real) Catalog 关系列出了供应商对零件收取的价格。
    • sid sname 地址 pid pname color sid pid cost ------------ ---------- ------------ -------------- s1 smith london p1 螺母红色 s1 p1 200 s2 jones paris p2 螺栓绿色 s1 p3 300 s3 blake paris p3 螺丝红色s2 p1 100 s4 克拉克伦敦 p4 凸轮蓝色 s2 p2 400 s5 亚当斯雅典 p5 齿轮绿色 s2 p3 200 s6(你)里贾纳 s2 p4 300 s2 p5 100 s3 p2 200 s3 p5 400 s4 p4 400 s5 p1 100 s5 p2 20 >
    • 对于每个只供应绿色零件的供应商,打印供应商的名称和她供应的零件总数。
    【解决方案2】:

    您可以清楚地数出绿色部分:

    select s.sname, count(distinct p.pid) as "Total #of Parts"
      from suppliers s
      join catalog c on c.sid = s.sid
      join parts p on p.pid = c.pid
     group by s.sname
    having count(distinct case when p.color = 'green' then 1 end ) = 1
    

    对于第二种情况,您可以考虑至少一个绿色部分和至少一个红色部分:

    select s.sname, max(c.cost) as "Max Price"
      from suppliers s
      join catalog c on c.sid = s.sid
      join parts p on p.pid = c.pid
     group by s.sname
    having count(case when p.color = 'green' then 1 end ) > 0
       and count(case when p.color = 'red' then 1 end ) > 0
    

    everysome 是 Oracle SQL 中的无效关键字。

    【讨论】:

    • 你提到的两个查询我都收到类似 ORA-00904: "C"."PID": invalid identifier 00904. 00000 - "%s: invalid identifier" 当我仍在执行时的错误没有解决需要帮助。
    • 对不起,我只需要更改连接语句的顺序。现在,我修复了@prashanthchittompally
    猜你喜欢
    • 2021-01-28
    • 2017-05-28
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2018-05-23
    相关资源
    最近更新 更多