Sql - “缺少右括号”错误解释

Posted

技术标签:

【中文标题】Sql - “缺少右括号”错误解释【英文标题】:Sql - "missing right parenthesis" error explanation 【发布时间】:2017-06-02 14:45:49 【问题描述】:

我的代码在语法上是正确的,我认为我不需要任何括号, 但是它不断出现错误“00907.00000 - “缺少右括号””,没有任何原因的解释

SELECT DISTINCT BG.name 
FROM Brand_Group BG
WHERE BG.pid=(SELECT P.pid 
  FROM Indicia_Publisher IP
  LEFT JOIN Publisher P ON IP.pid=P.pid
  WHERE (IP.cid=(SELECT Country.cid 
                FROM Country 
                WHERE Country.name='Belgium') AND ROWNUM<=1)
  GROUP BY P.pid
  ORDER BY COUNT(P.pid));

【问题讨论】:

ROWNUM 是 oracle 语法而不是 mysql.. 我已经删除了 mysql 标签 ORDER BY COUNT(P.pid) 应该怎么做? ORDER BY with Inner query, giving ORA-00907 missing right parenthesis的可能重复 【参考方案1】:

问题与比较子查询中的 ORDER BY 有关 - 它不是有效的语法,您可以通过运行以下查询来查看:

SELECT * FROM dual WHERE dummy IN (SELECT dummy FROM dual ORDER BY dummy);

删除ORDER BY 子句,您的查询应该可以正常运行。

另外,如果您想要返回不同的行并且您没有使用聚合函数(例如 MAX、SUM 等),那么您应该使用 DISTINCT,而不是 GROUP BY - 这会让您的意图更加清晰。但是,由于您已使用 and rownum = 1 将结果限制为单行,因此使用其中任何一个都没有多大意义!

您的查询可能类似于以下内容:

SELECT DISTINCT bg.name
FROM   brand_group bg
WHERE  bg.pid = (SELECT p.pid
                 FROM   indicia_publisher ip
                 LEFT   JOIN publisher p
                 ON     ip.pid = p.pid
                 WHERE  ip.cid = (SELECT country.cid
                                  FROM   country
                                  WHERE  country.name = 'Belgium') AND rownum <= 1);

ETA:我发现我稍微误读了您的原始 SQL,并误解了您的目标。看起来您正在寻找计数最多的 p.pids,因此以下内容应该可以满足您的需求:

SELECT DISTINCT bg.name
FROM   brand_group bg
WHERE  bg.pid = (SELECT p.pid
                 FROM   (SELECT p.pid,
                                COUNT(*) cnt,
                                MAX(COUNT(*)) OVER (PARTITION BY p.id) max_cnt
                         FROM   indicia_publisher ip
                         LEFT   JOIN publisher p
                         ON     ip.pid = p.pid
                         WHERE  ip.cid = (SELECT country.cid
                                          FROM   country
                                          WHERE  country.name = 'Belgium')
                         GROUP BY p.pid)
                 WHERE  cnt = max_cnt
                 AND    ROWNUM = 1);

如果有两个或多个不同的 p.pid 具有最高计数,and rownum = 1 确保只会选择一个(但它会是随机的)。可能你想在外部查询的比较中使用IN 而不是=,这样就不需要rownum = 1 谓词了。

【讨论】:

【参考方案2】:

这是 Oracle、SQL Server 吗? oracle不使用left,Sql server没有rownum。您是否希望在子查询中返回一个或多个值。看起来不止1。然后把BG.cid = ()改成ip.cid in()。您是否需要该子查询中的组。您在该子查询中没有计数。

我建议你一个一个执行子查询,看看会发生什么

您的原始版本混合了语法(oracle/Sql 服务器)。我假设这是 Oracle 数据库

SELECT DISTINCT BG.name 
FROM Brand_Group BG
WHERE BG.pid in 
    (SELECT P.pid 
    FROM Indicia_Publisher IP
    WHERE 
    IP.pid=P.pid (+) and
    (IP.cid=(SELECT Country.cid 
            FROM Country 
            WHERE Country.name='Belgium') AND ROWNUM<=1)    
    );

【讨论】:

"Oracle 不使用 left",你确定吗?另外,你确定这个查询会运行吗? Oracle 从 9i 版开始就使用 ANSI 连接语法,所以我不确定你为什么认为它不能处理 LEFT OUTER JOIN!

以上是关于Sql - “缺少右括号”错误解释的主要内容,如果未能解决你的问题,请参考以下文章

sql错误:ORA-00907:缺少右括号[重复]

Oracle SQL - 奇怪的“ORA-00907 缺少右括号”错误

ORACLE SQL 错误 - 缺少右括号 - 查询 [关闭]

Oracle SQL ORA-00907: CASE 语句中缺少右括号错误

在 oracle 10g 中出现错误 .. 错误:- ORA-00907:缺少右括号

错误报告 - ORA-00907: 缺少右括号 00907. 00000 - “缺少右括号