Oracle在GROUP BY中的COUNT()别名上抛出“无效标识符”

时间:2013-10-16 10:01:50

标签: sql oracle

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

假设:

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

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

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

  4. 这是我的疑问:

    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
    

3 个答案:

答案 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 })。