2017-05-01 25 views
1

我想讓這個在Oracle Apex中工作,並且不斷收到「ORA-00907:缺少右括號」錯誤,我無法弄清楚。我真的很感謝一些幫助。ORA-00907:在SQL中的自然連接上缺少右括號

SELECT Genre, ROUND(AVG(NumberofStreams)) AS "Average Number of Streams" 
FROM (SELECT Artist.Genre, Songs.NumberofStreams, Songs.SongID 
    FROM Songs 
    NATURAL JOIN Artist ON Songs.ArtistID = Artist.ArtistID) 
GROUP BY Genre; 
+1

當它是一個NATURAL JOIN時,是否包含'ON'子句或JOIN?也就是說,它應該是'NATURAL JOIN Artist')? –

回答

5

根據Oracle documentation,自然連接用於基於所有匹配的列名稱連接2個表。

因此,查詢中的問題是您無法指定您應該加入的特定列,因爲自然連接會基於所有匹配的列名稱進行連接。

所以在你的情況下,如果你想基於ArtistID加入,並假設這兩個表沒有任何其他匹配的列,請在Phil的評論中提及以下內容。

SELECT Genre, ROUND(AVG(NumberofStreams)) AS "Average Number of Streams" 
FROM 
(SELECT Artist.Genre, Songs.NumberofStreams, Songs.SongID 
    FROM Songs 
    NATURAL JOIN 
    Artist 
) 
GROUP BY Genre; 

,或者,如果有多個匹配列,但是你想加入僅僅基於ArtistID,您可以使用USING條款與INNER JOIN

SELECT Genre, ROUND(AVG(NumberofStreams)) AS "Average Number of Streams" 
FROM 
(SELECT Artist.Genre, Songs.NumberofStreams, Songs.SongID 
    FROM Songs 
    INNER JOIN 
    Artist 
    USING (ArtistID) 
) 
GROUP BY Genre; 

但是爲了避免混淆,最好是使用INNER JOINON子句,您可以從查詢中看到哪些列正在聯接。它也可以在加入不同名稱的列時使用。

SELECT Genre, ROUND(AVG(NumberofStreams)) AS "Average Number of Streams" 
FROM 
(SELECT Artist.Genre, Songs.NumberofStreams, Songs.SongID 
    FROM Songs 
    INNER JOIN 
    Artist 
    ON Songs.ArtistID = Artist.ArtistID 
) 
GROUP BY Genre; 
+2

我認爲通過「正常連接」你的意思是「**內**連接」;當你說「在Inner Join中」時,你的意思是「在子查詢中」。 –

+0

是的。用「內部連接」取代所有「正常連接」和「連接」以避免混淆。 – Utsav