2017-06-02 118 views
0

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

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)); 
+0

ROWNUM是oracle语法不是mysql ..我已经删除了mysql标签 –

+1

'ORDER BY COUNT(P.pid)'应该做些什么? – Aleksej

+2

[ORDER BY with Inner query,ORA-00907 missing right right brackhesis]可能重复(https://stackoverflow.com/questions/21859866/order-by-with-inner-query-giving-ora-00907-missing-右括号) –

回答

-2

是这个Oracle,SQL Server? Oracle不使用左边,Sql服务器没有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)  
    ); 
+1

“Oracle不使用左”,你确定吗?另外,你确定这个查询运行? – Aleksej

+0

Oracle自从9i版本开始使用ANSI连接语法,所以我不确定为什么你认为它不能处理LEFT OUTER JOINs! – Boneist

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而不是=,并且这将删除对谓词的需求。