SQL中的别名是这样工作的吗?

时间:2016-09-16 00:30:49

标签: sql oracle

在课堂上我们有3个数据库,Album(其中包含专辑编号或ano,以及mno(作为制作人的音乐家)),Song(ano(专辑中的专辑),sno(数字)与这首歌相关联))和Perform(sno(正在演唱的歌曲)和mno(表演艺术家))

所以,简单地说,我们有

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

我不知道怎么回答这个问题。那么有人可以帮忙吗?

编辑:现在我已经尝试了这个,这是我的新错误

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

2 个答案:

答案 0 :(得分:1)

这是Oracle限制。相关子查询的范围仅在嵌套中被识别为一个深度。您的相关子查询过于嵌套,Oracle无法识别外部别名。并非所有数据库都有此限制。

通常,我认为这是一件坏事。但是,遵循您的查询是相当困难的,因此重写无疑是一种简化。

您没有足够好地描述数据以提出具体答案,但GROUP BYHAVING可以解释为对此类问题有用。

此外,您无法使用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;