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

【讨论】:

我认为“正常加入”是指“inner加入”;当您说“in Inner Join”时,您的意思是“in the subquery”。 是的。将所有normal joinjoin 替换为inner join 以避免混淆。

以上是关于ORA-00907: SQL 中的自然连接缺少右括号的主要内容,如果未能解决你的问题,请参考以下文章

SQL 错误:ORA-00907:缺少右括号 00907。00000 -“缺少右括号”

将 XML 数据存储在表中的 PL/SQL 过程抛出错误(23,102):PL/SQL:ORA-00907:缺少右括号

Oracle SQL ORA-00907: CASE 语句中缺少右括号错误

Oracle Live SQL:ORA-00907:缺少右括号 -

sql错误:ORA-00907:缺少右括号[重复]

Oracle SQL - 奇怪的“ORA-00907 缺少右括号”错误