2017-04-07 1 views
1

Ich versuche, eine Abfrage erstellen die Korrelationskoeffizienten wählen als die am meisten bewerteten Film von einemWas ich in dieser Zusammenhang Abfrage in Oracle SqlDevelopper falsch mache

Benutzer zu bestimmen, wie diese

Die Struktur meiner Tabelle ist :

enter image description here

Meine Frage ist diese:

SELECT 
    user1, user2, 
    ((psum - (sum1 * sum2/n))/sqrt((sum1sq - pow(sum1, 2.0)/n) * (sum2sq - pow(sum2, 2.0)/n))) AS r, 
    n 
FROM 
    (SELECT 
     n1.idclient AS user1, 
     n2.idclient AS user2, 
     SUM(n1.cote) AS sum1, 
     SUM(n2.cote) AS sum2, 
     SUM(n1.cote * n1.cote) AS sum1sq, 
     SUM(n2.cote * n2.cote) AS sum2sq, 
     SUM(n1.cote * n2.cote) AS psum, 
     COUNT(*) AS n 
    FROM 
     cote AS n1 // <---------- Editor is pointing a missing parenthese here with a red line 
    LEFT JOIN 
     cote AS n2 ON n1.idfilm = n2.idfilm 
    WHERE 
     n1.idclient > n2.idclient 
    GROUP BY 
     n1.idclient, n2.idclient) AS step1 
ORDER BY 
    r DESC, n DESC 

Aber ich bin zuversichtlich, dass ich keine Klammern verpassen haben, was habe ich getan w Rong?

P. S: Ich bin kein Experte, und ich würde

Antwort

2

Oracle lässt Sie nicht für Tabelle Aliase verwenden AS verstehen mögen, nur für Spalte Aliase. The select-list syntax zeigt eine optionale AS; the table-reference syntax nicht.

In der Zeile markiert Sie

FROM cote AS n1 

die AS als Tabellen alias behandelt wird (obwohl es ein reserviertes Wort ist, so dass Sie es nicht für einen Alias ​​verwenden können); dann sieht es die n1 und weiß nicht, was es bedeutet. Der Parser scheint oft darauf zu tippen, dass alle offenen Klammern geschlossen worden sein sollten, unmittelbar vor dem Token in diesem Fall, da dieser das, was er bisher geparst hat, abgeschlossen haben könnte (ich vereinfache natürlich sehr viel); daher die nicht ganz hilfreiche Fehlermeldung.

So müssen Sie die AS aus allen drei Orten zu entfernen sind Sie es verwenden.

SELECT 
     user1, user2, 
     ((psum - (sum1 * sum2/n))/sqrt((sum1sq - pow(sum1, 2.0)/n) * (sum2sq - pow(sum2, 2.0)/n))) AS r, 
     n 
FROM 
     (SELECT 
       n1.idclient AS user1, 
       n2.idclient AS user2, 
       SUM(n1.cote) AS sum1, 
       SUM(n2.cote) AS sum2, 
       SUM(n1.cote * n1.cote) AS sum1sq, 
       SUM(n2.cote * n2.cote) AS sum2sq, 
       SUM(n1.cote * n2.cote) AS psum, 
       COUNT(*) AS n 
     FROM 
       cote n1 
    LEFT JOIN 
     cote n2 
    ON 
     n1.idfilm = n2.idfilm 
     WHERE 
       n1.idclient > n2.idclient 
    GROUP BY 
     n1.idclient, n2.idclient) step1 
ORDER BY 
     r DESC, 
     n DESC 
+0

„Oracle lässt Sie nicht wie für Tabelle Aliase verwenden, nur für Spaltenaliasnamen in der Zeile, die Sie markiert "Oh, mein Gott, jetzt verstehe ich, warum ich manchmal AS gebrauchen kann und manchmal kann ich nicht, aber das Seltsame ist in einem anderen Orakel-Editor, der es akzeptiert, ... Oracle ist eine große Welt und ich danke dir sehr viel für Ihre Zeit, es zu mir zu erklären – napi15

+1

Selbst wenn Ihr anderer Herausgeber das Problem nicht hervorhob, haben Sie den gleichen ORA-00907 Fehler erhalten, als Sie die Frage laufen ließen. –

+0

Yup, Sie haben Recht, denn wenn ich die Abfrage ausführen, erkannte es nicht "POW", sondern erkannte POWER. Ich habe nie verstanden, warum Oracle niemals gerne uniformiert wird und in allen Versionen die gleiche Syntax verwendet. Es ist nicht schwer, aber es verwirrt mich – napi15