在课堂上我们有3个数据库,Album(其中包含专辑编号或ano,以及mno(作为制作人的音乐家)),Song(ano(专辑中的专辑),sno(数字)与这首歌相关联))和Perform(sno(正在演唱的歌曲)和mno(表演艺术家))
所以,简单地说,我们有
ALBUM(ANO,MNO)
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
我不知道怎么回答这个问题。那么有人可以帮忙吗?
编辑:现在我已经尝试了这个,这是我的新错误
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
答案 0 :(得分:1)
这是Oracle限制。相关子查询的范围仅在嵌套中被识别为一个深度。您的相关子查询过于嵌套,Oracle无法识别外部别名。并非所有数据库都有此限制。
通常,我认为这是一件坏事。但是,遵循您的查询是相当困难的,因此重写无疑是一种简化。
您没有足够好地描述数据以提出具体答案,但GROUP BY
和HAVING
可以解释为对此类问题有用。
此外,您无法使用SELECT
中定义的别名来引用该列。您必须使用ALBUM.ANO
。
答案 1 :(得分:0)
我明白了谢谢你们!我不得不修改我的搜索,但我的编辑工作(减去第一行中由于sstan而修复的错误)
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;