1

我正在尝试返回以下三列:歌曲 ID、歌曲名称、播放次数。这表示请求和播放的歌曲列表。

假设:

  1. 表 SONG 有 SONG_ID 和 SONG_NAME,每首歌曲一行

  2. 每次请求歌曲时,表 SONG_REQUEST 只有 SONG_ID

  3. 每次播放歌曲时,表 PLAY 都有 SONG_ID

这是我的查询:

SELECT r.SONG_ID, s.SONG_NAME, COUNT(p.SONG_ID) AS TimesPlayed
FROM PLAY p
INNER JOIN SONG s ON p.SONG_ID = s.SONG_ID
LEFT JOIN SONG_REQUEST r ON p.SONG_ID = r.SONG_ID
GROUP BY p.SONG_ID, s.SONG_NAME, TimesPlayed

抛出的错误是:

ORA-00904: "TIMESPLAYED": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:
Error at Line: 5 Column: 33
4

3 回答 3

2

Oracle 不允许SELECT在子句中使用GROUP BY子句中的别名(您需要再次编写),但无论如何COUNT(p.SONG_ID)分组并没有多大意义。TimesPlayed您可能想完全删除它。

此外,您还可以选择这些列:

r.SONG_ID, s.SONG_NAME

...但尝试分组

p.SONG_ID, s.SONG_NAME

是错字吗?

于 2013-10-16T10:10:00.970 回答
1

像这样的东西应该工作:

SELECT r.SONG_ID, s.SONG_NAME, COUNT(p.SONG_ID) AS TimesPlayed
FROM PLAY p
INNER JOIN SONG s ON p.SONG_ID = s.SONG_ID
LEFT JOIN SONG_REQUEST r ON p.SONG_ID = r.SONG_ID
GROUP BY r.SONG_ID, s.SONG_NAME;

请注意,在group by子句中,我引用了与子句中完全相同的select(将别名更改pr)。

于 2013-10-16T10:09:40.827 回答
1

您不能在 group by 或 order 子句中引用列别名。

在任何情况下,正如 Colin 指出的那样,您实际上是按非聚合列分组的。

于 2013-10-16T10:06:10.757 回答