ORA-00907: SQL 中的自然连接缺少右括号
Posted
技术标签:
【中文标题】ORA-00907: SQL 中的自然连接缺少右括号【英文标题】:ORA-00907: missing right parenthesis on Natural Join in SQL 【发布时间】:2017-05-01 03:00:04 【问题描述】:我试图让它在 Oracle Apex 中工作,但我不断收到“ORA-00907:缺少右括号”错误,我无法弄清楚。我真的很感激一些帮助。
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;
【问题讨论】:
当它是自然连接时,在连接中包含ON
子句是否错误?即,应该只是NATURAL JOIN Artist)
吗?
【参考方案1】:
根据Oracle documentation,自然连接用于根据所有匹配的列名连接两个表。
因此,您的查询中的问题是您无法指定应加入的特定列,因为自然联接将基于所有匹配的列名进行联接。
因此,在您的情况下,如果您想基于 ArtistID 加入,并假设这两个表没有任何其他匹配列,请按照 Phil 在 cmets 中提到的那样使用以下内容。
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 JOIN
与ON
子句一起使用,从查询中可以看出,哪些列正在被连接。它也可以在连接具有不同名称的列时使用。
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;
【讨论】:
我认为“正常加入”是指“inner加入”;当您说“in Inner Join”时,您的意思是“in the subquery”。 是的。将所有normal join
和join
替换为inner join
以避免混淆。以上是关于ORA-00907: SQL 中的自然连接缺少右括号的主要内容,如果未能解决你的问题,请参考以下文章
SQL 错误:ORA-00907:缺少右括号 00907。00000 -“缺少右括号”
将 XML 数据存储在表中的 PL/SQL 过程抛出错误(23,102):PL/SQL:ORA-00907:缺少右括号
Oracle SQL ORA-00907: CASE 语句中缺少右括号错误