我正在尝试返回以下三列:歌曲ID,歌曲名称,时间播放。 这表示请求和播放的歌曲列表。
假设:
表SONG有SONG_ID和SONG_NAME,每首歌一行
表SONG_REQUEST每次请求歌曲时只有SONG_ID
每次播放歌曲时,表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
答案 0 :(得分:2)
Oracle不允许在SELECT
子句中使用GROUP BY
clasuse中的别名(您需要再次编写COUNT(p.SONG_ID)
)但是它没有多大意义无论如何,按TimesPlayed
分组。你可能想要完全删除它。
另外,您可以选择以下列:
r.SONG_ID, s.SONG_NAME
...但尝试按
分组p.SONG_ID, s.SONG_NAME
这是一个错字吗?
答案 1 :(得分:1)
您不能在group by或order子句中引用列别名。
无论如何,正如科林指出的那样,你实际上是按非聚合列进行分组。
答案 2 :(得分: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
子句相同(将别名p
更改为r
})。