2017-06-02 6 views
0

Mein Code ist syntaktisch korrekt und ich glaube nicht, dass ich eine Klammer brauche, aber es kommt immer wieder mit einem Fehler "00907. 00000 -" fehlende rechte Klammer "" ohne keine Erklärung der UrsacheSql - "fehlende rechte Klammer" Fehlererklärung

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 ist Oracle-Syntax nicht mysql .. Ich habe das mysql-Tag entfernt –

+1

Was sollte 'ORDER BY COUNT (P.pid)' tun? – Aleksej

+2

Mögliches Duplikat von [ORDER BY mit Innerer Abfrage, wobei ORA-00907 fehlende rechte Klammer fehlt] (https://stackoverflow.com/questions/21859866/order-by-with-inner-query-giving-ora-00907-missing- rechte Klammer) –

Antwort

-2

ist das Oracle, SQL Server? Oracle verwendet nicht links, Sql-Server hat nicht rownum. Erwarten Sie, dass ein oder mehrere Werte in der Unterabfrage zurückgegeben werden. es sieht aus wie mehr als 1. Dann ändern Sie BG.cid =() zu ip.cid in(). Brauchen Sie die Gruppe in dieser Unterabfrage? Sie müssen in dieser Unterabfrage nicht zählen.

Ich schlage vor, Sie subquery nacheinander ausführen, was

Ihre ursprüngliche Syntax gemischt hat geschieht, um herauszufinden, (Oracle/SQL-Server). Ich werde davon ausgehen, das ist Oracle Datenbank

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 benutzt nicht links", bist du sicher? Sind Sie sicher, dass diese Abfrage ausgeführt wird? – Aleksej

+0

Oracle hat seit Version 9i die ANSI-Joinsyntax verwendet, daher bin ich mir nicht sicher, warum Sie meinen, dass es nicht mit LEFT OUTER JOINs umgehen kann! – Boneist

2

Das Problem ist, mit dem ORDER BY im Vergleich Unterabfrage zu tun - es ist nicht eine gültige Syntax, die Sie, indem Sie die folgende Abfrage sehen können:

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

Entfernen Sie die ORDER BY-Klausel, und Ihre Abfrage sollte ohne Problem ausgeführt werden.

Wenn Sie möchten, dass bestimmte Zeilen zurückgegeben werden und Sie keine Aggregatfunktion verwenden (z. B. MAX, SUMME usw.), sollten Sie DISTINCT, nicht GROUP BY verwenden. Dadurch wird Ihre Absicht deutlich klarer . Da Sie die Ergebnisse jedoch auf eine einzelne Zeile mit and rownum = 1 beschränkt haben, ist es auch nicht sinnvoll, sie zu verwenden!

Ihre Abfrage sollte wahrscheinlich etwas entlang der Linien der folgenden sein:

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: Ich sehe, dass ich Ihre ursprüngliche SQL etwas falsch verstanden und falsch interpretiert, was Sie nach waren. Es sieht aus wie Sie nach den p.pids mit der höchsten Zählung sind, so ist folgendes zu tun, was Sie nach:

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

Wenn es zwei oder mehr verschiedene p.pids, die die höchste Zählung haben, Die and rownum = 1 stellt sicher, dass nur eine ausgewählt wird (aber es wird zufällig sein). Möchten Sie IN lieber als = im Vergleich der äußeren Abfrage verwenden, und das würde die Notwendigkeit für das rownum = 1 Prädikat entfernen.

Verwandte Themen