Sql - "缺少右括号"错误解释

时间:2017-06-02 14:45:50

标签: sql oracle

我的代码在语法上是正确的,我不认为我需要任何括号, 但它不断出现错误" 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));

2 个答案:

答案 0 :(得分:2)

问题与比较子查询中的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.pids具有最高计数,and rownum = 1确保只挑选一个(但它是随机的)。您是否希望在外部查询的比较中使用IN而不是=,这样就无需使用rownum = 1谓词。

答案 1 :(得分:-2)

这是Oracle,SQL Server吗? Oracle不使用left,Sql server没有rownum。您是否期望在子查询中返回一个或多个值。它看起来超过1.然后将BG.cid =()更改为()中的ip.cid。您是否需要该子查询中的组。你没有计算该子查询。

我建议您逐个执行子查询以了解发生的情况

您的原始语法混合了语法(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)    
    );