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 - “缺少右括号”错误解释的主要内容,如果未能解决你的问题,请参考以下文章
Oracle SQL - 奇怪的“ORA-00907 缺少右括号”错误
ORACLE SQL 错误 - 缺少右括号 - 查询 [关闭]
Oracle SQL ORA-00907: CASE 语句中缺少右括号错误