2016-09-16 16 views
0

私たちは3つのデータベースを持っています。Album(アルバム番号またはano、mno(プロデューサーのミュージシャン))、Song(ano(それがアルバム)、sno(この特定の曲に関連付けられている番号))、および(SNO(実行されている曲)を実行し、MNO(実行作家))SQLのエイリアスはこのように動作しますか?

ので、単純化して、私たちは

ALBUM(ANO、MNO)

SONG(ANO、SNOを持っています)

PERFORM(SNO、MNO);

プロデューサー以外の誰かによって演奏された曲があるアルバムのANOを見つけることです。

私のクエリは、この

SELECT ALBUM.ANO AS ALBUM_NUM 
FROM ALBUM 
WHERE ALBUM.MNO != (
    SELECT PERFORM.MNO 
    FROM PERFORM 
    WHERE PERFORM.SNO IN (
    SELECT SONG.SNO 
    FROM SONG 
    WHERE SONG.ANO = ALBUM_NUM 
) 
); 

であると私は、私はこの質問を行うにはどのように他を知らない

WHERE SONG.ANO = ALBUM_NUM 
        * 
ERROR at line 9: 
ORA-00904: "ALBUM_NUM": invalid identifier 

このエラーが発生します。それで誰も助けることができますか?

EDITは:今、私はこれを試してみた、これは私の新しいエラー

SELECT ALBUM.ANO 
FROM ALBUM A 
INNER JOIN PERFORM P 
ON P.MNO != A.MNO 
INNER JOIN SONG S 
ON S.ANO = A.ANO 
AND S.SNO = P.SNO; 

SELECT ALBUM.ANO 
     * 
ERROR at line 1: 
ORA-00904: "ALBUM"."ANO": invalid identifier 
+1

を私は私の検索を修正しなければならなかったが、私の編集は、働いていた(マイナスsstanのおかげで固定された最初の行にエラー):あなたは 'A'で' ALBUM'を別名、あなたがする必要があるので、 'select'節で' A.ANO'を使います。 – sstan

+0

助けてくれてありがとう! –

答えて

1

これは、Oracleの制限です。相関サブクエリのスコープは、ネストでは1つの深さしか認識されません。相関サブクエリがネストすぎてOracleが外部エイリアスを認識できません。すべてのデータベースにこの制限があるわけではありません。

通常、これは悪いことだと思います。しかし、あなたの質問に続くことはやや難しいので、間違いなく簡単に書き直すことは簡単です。

具体的な回答を示唆するだけのデータは記述していませんが、このタイプの質問にはGROUP BYHAVINGが便利です。

さらに、SELECTで定義されている別名を使用して列を参照することはできません。 ALBUM.ANOを使用する必要があります。

0

私はそれをあなたにありがとう!その編集について

SELECT DISTINCT A.ANO 
FROM ALBUM A 
INNER JOIN PERFORM P 
ON P.MNO != A.MNO 
INNER JOIN SONG S 
ON S.ANO = A.ANO 
AND S.SNO = P.SNO 
ORDER BY A.ANO; 
関連する問題