1

次の 3 つの列を返そうとしています: 曲 ID、曲名、再生回数。これは、リクエストされて再生された曲のリストを表します。

仮定:

  1. テーブル SONG には SONG_ID と SONG_NAME があり、曲ごとに 1 つの行があります

  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

You can't refer to a column alias in the group by or order clauses.

In any case, as Colin points out, you'd actually group by the non-aggregated columns.

于 2013-10-16T10:06:10.757 に答える
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参照していることに注意してください(エイリアスを に変更)。selectpr

于 2013-10-16T10:09:40.827 に答える