2017-06-02 136 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而不是=,並且這將刪除對謂詞的需求。